思路是先进行排序
然后固定左边元素(如果和之前元素重复需要跳过)
从剩下的元素中找到两个数使3个数和为0,找的时候采用从两头往中间找的方法
如果和小于零,那么左边游标前进
如果和大于零,那么右边游标后退
如果和等于零,那么左右同时往中间靠拢,并且跳过所有和当前值相等元素
左游标大于等于右游标时退出循环
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> zz = new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
if(len<3)
return zz;
for(int i=0;i<len-2;i++){
// System.out.println(zz);
while(i!=0&&i<len-2&&nums[i]==nums[i-1])i++;
int p = i+1, q = len -1;
while(p<q){
if(nums[i]+nums[p]+nums[q]==0){
List<Integer> tmp = new ArrayList<>();
tmp.add(nums[i]);
tmp.add(nums[p]);
tmp.add(nums[q]);
zz.add(tmp);
p++;
q--;
while(p<q&&nums[p]==nums[p-1])p++;
while(q!=len-1&&p<q&&nums[q]==nums[q+1])q--;
}else if(nums[i]+nums[p]+nums[q]<0){
p++;
}else{
q--;
}
}
}
return zz;
}
}