思路是先進(jìn)行排序
然后固定左邊元素(如果和之前元素重復(fù)需要跳過(guò))
從剩下的元素中找到兩個(gè)數(shù)使3個(gè)數(shù)和為0痰哨,找的時(shí)候采用從兩頭往中間找的方法
如果和小于零君丁,那么左邊游標(biāo)前進(jìn)
如果和大于零,那么右邊游標(biāo)后退
如果和等于零钠怯,那么左右同時(shí)往中間靠攏,并且跳過(guò)所有和當(dāng)前值相等元素
左游標(biāo)大于等于右游標(biāo)時(shí)退出循環(huán)
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;
}
}