leetcode15-3Sum

题目

给你一个整数数组 nums ,判断是否存在三元组 nums\[i, numsj, numsk] 满足 i != j、i != k 且 j != k ,同时还满足 numsi + numsj + numsk == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = -1,0,1,2,-1,-4

输出:\[-1,-1,2,-1,0,1]

解释:

nums0 + nums1 + nums2 = (-1) + 0 + 1 = 0 。

nums1 + nums2 + nums4 = 0 + 1 + (-1) = 0 。

nums0 + nums3 + nums4 = (-1) + 2 + (-1) = 0 。

不同的三元组是 -1,0,1 和 -1,-1,2 。

注意,输出的顺序和三元组的顺序并不重要。

分析

可以想一想2Sum的解法,所以我们整体的思路就是固定一个元素,然后求剩下的元素当中哪俩个元素的和满足(0-固定的这个元素)的大小。同时我们可以有一些优化的地方,我们在排序以后固定元素的时候如果发现元素比0大,这种可以直接break了,因为比0大的元素不可能再和其它元素相加等于0,然后如果上一个元素和当前元素相同的这种重复场景也可以忽略

最终由于list需要唯一,可以借助set来实现

java 复制代码
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.Arrays;

public class threeSum {
	public static void main(String[] args) {
		int[] arr = {-1,0,1,2,-1,-4};
		List<List<Integer>> lis = getLis(arr);
		for(List<Integer> li : lis) {
			li.stream().forEach(System.out::println);
			System.out.println();
		}
	}
	public static List<List<Integer>> getLis(int[] nums) {
		int len = nums.length;
		Arrays.sort(nums);
		Set<List<Integer>> set = new HashSet();
		for(int i = 0;i<len-2;i++) {
			if(nums[i] > 0) {
				break;
			}
			if(i > 0 && nums[i-1] == nums[i]) {
				continue;
			}
			int j = i+1;
			int k = len - 1;
			int target = 0 - nums[i];
			while(j<k) {
				if(nums[j] + nums[k] == target) {
					List<Integer> lis = new ArrayList();
					lis.add(nums[i]);
					lis.add(nums[j]);
					lis.add(nums[k]);
					j++;
					k--;
					set.add(lis);
				} else if(nums[j]+nums[k] < target) {
					j++;
				} else {
					k--;
				}
			}
		}
		List<List<Integer>> res = new ArrayList();
		res.addAll(set);
		return res;

	}
}
相关推荐
Lazionr5 分钟前
手撕 unordered_set 和 unordered_map,剖析哈希表底层实现
c++·算法
智购科技无人售货机工厂店6 分钟前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse
镜象科技15 分钟前
中小学AI心理健康解决方案服务商怎么选?2026年选型参考
android·java·人工智能
0+11115 分钟前
算法 --归并排序
数据结构·算法·排序算法
阿狗童鞋21 分钟前
高并发系统设计实战指南
java·spring boot·spring cloud
Run_Teenage23 分钟前
算法:树的重心、树的直径
算法
专注仿真24 分钟前
高代价计算后置:探测、交战、毁伤三条链路的统一设计哲学
算法·探测·毁伤
xie0510_24 分钟前
Any类简要实现
开发语言·c++·算法
Sam_Deep_Thinking26 分钟前
CountDownLatch实现原理
java·后端·面试·程序员
小狼Solar28 分钟前
SAP MDG 功能范围说明(基于S/4HANA 2025)
java·开发语言