双指针思想:三层循环,假设第一个数已知,再根据a+b+c=0的规则,得出b与c的关系,确定双指针之间的关系,将三重循环降为二重循环.
public List<List<Integer>> threeSum(int[] nums) {
int n = nums.length;
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<List<Integer>>();
for(int i = 0 ; i< n; i++){
if(i>0 && nums[i] == nums[i-1]){
continue;
}
int last = n-1;
int result = -nums[i];
for(int j = i+1; j<n ;j++){
if(j>i+1 && nums[j] == nums[j-1]){
continue;
}
while (j<last && nums[j] + nums[last] > result){
last--;
}
if(j==last) break;
if(nums[j] + nums[last] == result){
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[last]);
ans.add(list);
}
}
}
return ans;
}