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;

	}
}
相关推荐
qq_336313938 分钟前
java基础-IO流(随机点名器)
java·开发语言·python
CoovallyAIHub9 分钟前
仅192万参数的目标检测模型,Micro-YOLO如何做到目标检测精度与效率兼得
深度学习·算法·计算机视觉
sali-tec15 分钟前
C# 基于OpenCv的视觉工作流-章10-中值滤波
图像处理·人工智能·opencv·算法·计算机视觉
brave_zhao17 分钟前
launch4j亲测打包java的jar转为exe执行文件
java
利刃大大17 分钟前
【RabbitMQ】SpringBoot整合RabbitMQ:工作队列 && 发布/订阅模式 && 路由模式 && 通配符模式
java·spring boot·消息队列·rabbitmq·java-rabbitmq
lkbhua莱克瓦2418 分钟前
进阶-存储对象1-视图
java·数据库·sql·mysql·视图
yangminlei21 分钟前
Spring Boot 自动配置原理与自定义 Starter 开发实战
java·数据库·spring boot
悟空码字22 分钟前
10分钟搞定!SpringBoot集成腾讯云短信全攻略,从配置到发送一气呵成
java·spring boot·后端
爱编程的小吴24 分钟前
【力扣练习题】151. 反转字符串中的单词
java·算法·leetcode