题目![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f2d9c9154e7de570980674e6e1b2045e.png)
方法:双指针![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2e470d77c72da62b5b177e0301168410.png)
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List <Integer>> threeSum=new ArrayList<List <Integer>>();
int k=0;
while(k<nums.length){
int i=k+1;
int j=nums.length-1;
while(i<j){
List <Integer> arr=new ArrayList<>();
if(i>=nums.length-1&&j<=k){
break;
}
if(nums[k]+nums[i]+nums[j]==0){
arr.add(nums[k]);
arr.add(nums[i]);
arr.add(nums[j]);
threeSum.add(arr);
i++;
j--;
for(;i<nums.length-1&&nums[i-1]==nums[i];i++);
for(;j>k&&nums[j]==nums[j+1];j--);
continue;
}
if(nums[k]+nums[i]+nums[j]<0){
i++;
for(;i<nums.length-1&&nums[i]==nums[i-1];i++);
continue;
}
if(nums[k]+nums[i]+nums[j]>0){
j--;
for(;j>k&&nums[j]==nums[j+1];j--);
continue;
}
}
k++;
for(;k<nums.length-2&&nums[k]==nums[k-1];k++);
}
return threeSum;
}
}
注意点:
- 每当要用数组时检查是否已经出界
- 比如K,I,J遇到一样的都要跳过,但是,一个问题是,必须要保证第一个是有的,故采用nums[k]==nums[k-1]这种,而不是nums[k]==nums[k+1]