给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
解题思路:因为题目要求结果列表中的列表序列是不可以重复的(这种题不用想搜索,还需要控制上下元素是否相同,传参极其麻烦)。如果没有限制,可以直接三重循环来求所有的解集。
可以通过排序操作,让全部元素归为一个有序序列。并且为了降低复杂程度,可以使用两层循环,第三个值可以使其指向最后一个元素,通过前两个值相加的结果与其比较,如果小于第三个值,那么第三个值得索引需要左移,直到与b重合。判断重合的时候直接break;掉就可以了。
注意:通过后两个值与第一个比也可以,通过前两个和第三个值相比也可以,掌握好需要变化的情况就可以。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
Arrays.sort(nums) ;
for(int a=0; a<nums.length-2; a++){
if(a>0 && nums[a] == nums[a-1])
continue;
int c = nums.length-1;
for(int b=a+1; b<nums.length; b++){
if(b>a+1 && nums[b]==nums[b-1])
continue;
int mid = nums[a] + nums[b] ;
if(-mid > nums[c])
continue;
while(b<c && -mid<nums[c]) {
--c;
}
if(b == c) break;
if(mid == -nums[c]){
List<Integer> tmp = new ArrayList<Integer>();
tmp.add(nums[a]);
tmp.add(nums[b]);
tmp.add(nums[c]);
ans.add(tmp);
}
}
}
return ans;
}
}