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;

	}
}
相关推荐
毕竟是shy哥3 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
学长毕业设计3 小时前
基于SpringBoot的公益基金管理系统(源码+文档+讲解视频)
java·spring boot·后端
东小西4 小时前
【SAA实战】第 3 篇 · 工具调用全攻略:把业务能力交给 Agent 自己调度
java·后端·spring
东小西4 小时前
【SAA实战】第 4 篇 · Agent 短期记忆:saver 让 Agent 跨轮记得住(threadId 隔离)
java·后端·spring
圣保罗的大教堂4 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
许彰午4 小时前
22-DataCenter报文序列化
java·低代码·架构·状态模式
2601_962065254 小时前
[MySQL] SQL优化之性能分析
java·sql·mysql
怕浪猫4 小时前
AI Agent 的安全围栏:DeepSeek Harness 沙箱隔离策略全解析
面试·agent·产品经理
小范同学_4 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言