【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;
    }
}
相关推荐
凯子坚持 c几秒前
深度解析算法之滑动窗口
数据结构·算法
安然无虞11 分钟前
31天Python入门——第17天:初识面向对象
后端·爬虫·python·职场和发展
程序员小远24 分钟前
Python+requests实现接口自动化测试框架
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
xyliiiiiL29 分钟前
二分算法到红蓝染色
java·数据结构·算法
编程、小哥哥32 分钟前
spring之添加freemarker模版熏染
java·后端·spring
hong_zc41 分钟前
Spring 拦截器与统一功能的处理
java·后端·spring
User_芊芊君子43 分钟前
【Java】——数组深度解析(从内存原理到高效应用实践)
java·开发语言
珹洺2 小时前
C++从入门到实战(十)类和对象(最终部分)static成员,内部类,匿名对象与对象拷贝时的编译器优化详解
java·数据结构·c++·redis·后端·算法·链表
一 乐2 小时前
网红酒店|基于java+vue的网红酒店预定系统(源码+数据库+文档)
java·开发语言·数据库·毕业设计·论文·springboot·网红酒店预定系统
写bug的小屁孩2 小时前
移动零+复写零+快乐数+盛最多水的容器+有效三角形的个数
c++·算法·双指针