https://leetcode-cn.com/problems/3sum/
固定i从排序后数组左边开始扫,用双指针收缩寻找两数之和。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0; i < nums.length;i++){
//如果最左端都大于0了,就不存在三数之和=0的情况了
if(nums[i] > 0) return res;
//如果i和i+1作比较,(-1,-1,2)这种情况就会被略过
if(i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1;
int right = nums.length - 1 ;
while(right > left){
int sum = nums[i] + nums[left] + nums[right];
/*要先找到答案,然后left和right往中间收缩,如果在while循环最开始的话
0,0,0就会省略掉*/
if(sum > 0){
right--;
}else if(sum < 0){
left++;
}else{
res.add(Arrays.asList(nums[i],nums[left],nums[right]));
while(right > left && nums[right] == nums[right - 1]) right--;
while(right > left && nums[left] == nums[left + 1]) left++;
//由于上面的两个while只会收缩到与答案相同的left和right,所以还需后面一步进行进一步的收缩
right--;
left++;
}
}
}
return res;
}
}