【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;
    }
}
相关推荐
寻道码路6 分钟前
LangChain4j Java AI 应用开发实战(二十六):多模型集成策略 —— OpenAI、DeepSeek、阿里百炼混合使用
java·开发语言·人工智能·ai
ch.ju12 分钟前
Java Programming Chapter 4——Static code block
java·开发语言
risc12345614 分钟前
Lucene80DocValuesConsumer 五种类型源码阅读顺序
java·服务器·前端
弹简特15 分钟前
【Java项目-企悦抽】04-项目演示+项目源码+AI赋能整理接口文档
java·开发语言
万亿少女的梦16826 分钟前
基于Spring Boot的楚雄旅游景区门票售卖系统设计与实现
java·spring boot·mysql·vue·系统设计
编程圈子26 分钟前
电机驱动开发学习18. SVPWM空间矢量调制算法详解与实现
驱动开发·学习·算法
不会写代码的ys26 分钟前
C++复习篇
java·开发语言·c++
Vect__1 小时前
Go 数据结构 slice 深度剖析
开发语言·数据结构·golang
AI科技星1 小时前
基于32维Cayley_Dickson超复数的全域拓扑统一场论——反重力、真空自持供能、维度瞬移与星际宇宙脑秩序体系
人工智能·学习·算法·机器学习·数据挖掘
我是个假程序员1 小时前
实例化动作脚本类,并执行,执行类似N_F1_SAVE.java这种
java·nc