给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
思路:
犹豫不决先排序,步步逼近双指针
这个题可以使用双指针来解决, 最主要的问题就是解决相同的序列的问题
这里先进行排序,然后指针k从0-length-3,期间用双指针i、j来遍历得到取值等于0的解。
这里当遇到相同的就不需要再判断了 ,应该直接跳过。
while(i<j&&nums[i]==nums[++i])
等价于
i++ while(i<j&&nums[i-1]==nums[i]) i++
因为我们将i++之后要判断这个数和他前面的是不是一样的,如果是一样的 那么我们i继续后移一位,然后再判断,一直到不同为止。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//排序+双指针解决问题
Arrays.sort(nums,0,nums.length);
List<List<Integer>> res=new ArrayList<>();
for(int k=0;k<nums.length-2;k++){
if(nums[k]>0)
break;
if(k>0&&nums[k]==nums[k-1])
continue;
int i=k+1;
int j=nums.length-1;
while(j>i){
int t=nums[i]+nums[j]+nums[k];
if(t>0){
//数大了 j--
j--;
while(i<j&&nums[j+1]==nums[j])
j--;
}else if(t<0){
i++;
while(i<j&&nums[i-1]==nums[i])
i++;
}else{
List<Integer> list=new ArrayList<>();
list.add(nums[k]);
list.add(nums[i]);
list.add(nums[j]);
res.add(list);
while(i<j&&nums[i]==nums[++i]);
while(i<j&&nums[j]==nums[--j]);
}
}
}
return res;
}
}