【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;
    }
}
相关推荐
Hx_Ma161 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode2 小时前
原子操作类LongAdder
java·开发语言
舟舟亢亢3 小时前
Java集合笔记总结
java·笔记
L_09073 小时前
【C++】高阶数据结构 -- 红黑树
数据结构·c++
A_nanda3 小时前
c# MOdbus rto读写串口,如何不相互影响
算法·c#·多线程
小酒窝.3 小时前
【多线程】多线程打印ABC
java
乡野码圣3 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库
JAVA+C语言3 小时前
如何优化 Java 多主机通信的性能?
java·开发语言·php
编程彩机4 小时前
互联网大厂Java面试:从分布式架构到大数据场景解析
java·大数据·微服务·spark·kafka·分布式事务·分布式架构
代码雕刻家5 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯