题目描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
思路
难点在于去重
- 将数组排序
- 三个数中一个绝对小于等于0,否则三数之和不能为0.
- 一个数从左到右遍历直到右边界或者nums[i]大于0.
- 每遍历一次i,都执行下面的任务。(更新i注意去重)
- 用left,right表示其余两个数,left每次初始是i+1,right每次初始是右边界。
- 当i,left,right指向的数和为0,保存数值,更新left。(更新left注意去重)
- 当i,left,right指向的数和小于0,left++
- 当i,left,right指向的数和小于0,right–
更新i注意去重:
不能这样去重
if(i+1 < nums.length && nums[i] == nums[i+1]){
continue;
}//这样去重会遗漏其他成功的可能性
应该这样,这样才不会遗漏掉像[-1,-1,2]的情况,上面的哪种方式会遗漏。
if(i > 0 && nums[i-1] == nums[i]){
continue;
}
更新left注意去重:
当left后面的值和nums[left]一样,跳过,直到不一样。
while(left < right && nums[left] == nums[left+1]){
left++;
}
left++;
import java.util.*;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
for(int i = 0; i < nums.length && nums[i] < 1; i++){
if(i > 0 && nums[i-1] == nums[i]){
continue;
}
int left = i+1;
int right = nums.length - 1;
while(left < right){
int temp = nums[i] + nums[left] + nums[right];
if(temp < 0){
left++;
}else if(temp > 0){
right--;
}else{
List<Integer> li = new ArrayList<>();
li.add(nums[i]);
li.add(nums[left]);
li.add(nums[right]);
res.add(li);
while(left < right && nums[left] == nums[left+1]){
left++;
}
left++;
}
}
}
return res;
}
}
本文介绍了一个经典的编程问题——三数之和的解决方案。通过数组排序和双指针技巧,有效地找到数组中三个数相加为0的所有组合,并避免了重复解。

被折叠的 条评论
为什么被折叠?



