leetcode15-3Sum

题目

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

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

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

示例 1:

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

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

解释:

nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。

nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。

nums[0] + nums[3] + nums[4] = (-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;

	}
}
相关推荐
小毛驴85015 分钟前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
雾里看山44 分钟前
顺序表VS单链表VS带头双向循环链表
数据结构·链表
DKPT1 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好奇的菜鸟2 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
大千AI助手3 小时前
DTW模版匹配:弹性对齐的时间序列相似度度量算法
人工智能·算法·机器学习·数据挖掘·模版匹配·dtw模版匹配
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社23 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
好好研究3 小时前
学习栈和队列的插入和删除操作
数据结构·学习
幽络源小助理3 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring