【leetcode19】三数之和==有点难还没看懂❗==

原题链接

方法一:双指针法

这道题目使用双指针法 要比哈希法高效一些

解题思路链接:

https://www.programmercarl.com/0015.三数之和.html#思路

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result=new ArrayList<>();
        Arrays.sort(nums);
        // 找出a + b + c = 0
        // a = nums[i], b = nums[left], c = nums[right]
        for(int i=0;i<nums.length;i++){
        // 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
        if(nums[i]>0) return result;
        if(i>0&&nums[i]==nums[i-1]) continue;// 去重a
        int left=i+1;
        int right=nums.length-1;
        while(right>left){
            int sum=nums[i]+nums[left]+nums[right];
            if(sum>0){
                right--;
            }else if(sum<0){
                left++;
            }else{
                result.add(Arrays.asList(nums[i],nums[left],nums[right]));
                // 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
                while(right>left&&nums[right]==nums[right-1])right--;
                while(right>left&&nums[left]==nums[left+1])left++;

                right--;
                left++;
             }
            }
        }
        return result;
    }
}

方式二:使用哈希集合

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
	List<List<Integer>> result = new ArrayList<>();
	Arrays.sort(nums);

	for (int i = 0; i < nums.length; i++) {
		// 如果第一个元素大于零,不可能凑成三元组
		if (nums[i] > 0) {
			return result;
		}
		// 三元组元素a去重
		if (i > 0 && nums[i] == nums[i - 1]) {
			continue;
		}

		HashSet<Integer> set = new HashSet<>();
		for (int j = i + 1; j < nums.length; j++) {
			// 三元组元素b去重
			if (j > i + 2 && nums[j] == nums[j - 1] && nums[j - 1] == nums[j - 2]) {
				continue;
			}

			int c = -nums[i] - nums[j];
			if (set.contains(c)) {
				result.add(Arrays.asList(nums[i], nums[j], c));
				set.remove(c); // 三元组元素c去重
			} else {
				set.add(nums[j]);
			}
		}
	}
	return result;
    }
}
相关推荐
是小蟹呀^3 小时前
Spring Security + JWT 面试题整理
java·jwt·springsecurity
2601_954526755 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
spencer_tseng5 小时前
Redis + Nacos.bat
java·windows·dos
troyzhxu6 小时前
列表查询的 GraphQL —— 一行代码终结你的 if-else 地狱!
java·springboot·graphql
叩码以求索6 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
孫治AllenSun6 小时前
【DataX】生产环境搭建DataX集群案例
java·开发语言·jvm
谙弆悕博士6 小时前
信息系统项目管理师教程(第4版)笔记——第 2 章 信息技术发展
笔记·职场和发展·软考高级·软考·高项·项目经理
c238567 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
好好沉淀7 小时前
@NotBlank(message = “{xxx}“) 注解中花括号的含义
java