三数之和
Posted cocobear9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三数之和相关的知识,希望对你有一定的参考价值。
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
链接:https://leetcode-cn.com/problems/3sum
写在前面:萌新我还是有点菜的一TNT,本题与 1. 两数之和 类似,是非常经典的面试题,但是做法不尽相同。
这里使用的排序+双指针的方法https://www.bilibili.com/video/BV1LZ4y1W7DD?from=search&seid=8972013113548898136小姐姐NB!
package aboutArray; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ThreeSum { public static void main(String[] args) { // TODO Auto-generated method stub int[] nums= {-2,0,1,1,2}; List<List<Integer>> list = threeSum(nums); for(List<Integer> l:list) { System.out.println(l); } } public static List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res = new ArrayList<>(); Arrays.sort(nums);//排序 int n =nums.length; for(int i=0;i<n-2;i++) { //第一个数nums[i]也要去重 if(i>0 && nums[i]==nums[i-1]) { continue ; } int target =0-nums[i]; int start =i+1; int end =n-1; while(start<end) { int sum=nums[start]+nums[end]; if(sum == target) { //注意这里两数之和相等,对应的start和end指针已经对应的自增和自减了 res.add(Arrays.asList(nums[i],nums[start++],nums[end--])); //内部双指针需要去重由于start已经自增一次了,所以start应该和上一次比较start-1 while(start<end&&nums[start]==nums[start-1]) { start++; } //由于end已经自减一次了,所以end应该和上一次比较end+1 while(start<end && nums[end]==nums[end+1]) { end--; } } else if(sum>target) { //和大于目标值,那么要让和减少一点end-- end--; } else { //同理 start++; } } } return res; } }
以上是关于三数之和的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结