题目描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
**注意:**答案中不可以包含重复的三元组。
思路
首先对nums排序,每次先固定一个nums[i],然后在i后面的部分使用双指针l和r进行搜索,如果nums[i]+nums[l]+nums[r]<0,那么l右移,否则r左移
需要保证i,l,r都被去重过,所以在每次迭代一个新的i时,跟之前处理过的nums[i-1]对比,如果相等那么跳过此次迭代;每次找到一个满足条件的i,l,r时,对l和r去重,跟还未处理过的nums[l+1],nums[r-1]对比,相同则跳过。
代码
html
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0; i < nums.length-2; i++){
if(i>0&&nums[i]==nums[i-1]) continue;
int l=i+1,r=nums.length-1;
while(l<r){
if(nums[l]+nums[r]==-nums[i]){
ans.add(List.of(nums[l],nums[r],nums[i]));
while(l<r&&nums[l]==nums[l+1]) l++;
while(l<r&&nums[r]==nums[r-1]) r--;
l++;
r--;
}
else if(nums[l]+nums[r]<-nums[i]){
l++;
}
else{
r--;
}
}
}
return ans;
}
}