1、数组排序
2、左边固定一个指针,遍历
3、右边两个移动指针
4、三个指针指向的值求和判断
5、a配对的b/c可能有多个,所以需要将b/c的指针均移动到下一个和b/c不同的值处
TC = O(n^2)
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(nums==null || nums.length==0)
return res;
Arrays.sort(nums);
int a,b,c;
int n = nums.length;
for(int i=0; i<n; i++){
if(i-1>=0 && nums[i]==nums[i-1])
continue;
a = nums[i];
int s=i+1,e=n-1;
while(s<e){
b=nums[s];
c=nums[e];
if(a+b+c==0){//a配对的b/c可能有多个,所以需要将b/c的指针均移动到下一个和b/c不同的值
res.add(Arrays.asList(a,b,c));
while(s<e && nums[s]==nums[s+1]) s++;
while(s<e && nums[e]==nums[e-1]) e--;
s++;
e--;
}else if(a+b+c<0){
s++;
}else{
e--;
}
}
}
return res;
}
}