LeetCode[15].三数之和

整体思路是:先排序 + 一重 for 循环 + 双指针
Note(1) for循环中如果当前数字和上一个数字一样,则直接跳过该数字,否则结果会重复
(2) 关于条件判断中的
while
去重操作,为何要用while(l<r && nums[l]==nums[++l]);
而不能用while(l<r && nums[l]==nums[l+1]){l++};
因为后者会停留在重复数字中的最后一个,而不是重复数字的后一个非重数字[1,2,2,2,3,4] 前者会停留在数字 3 ,而后者会停留在最后一个 2
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<>();
for(int i = 0;i<nums.length;i++){
if(nums[i]>0) break;
//特判!特判!特判!!!!!!!!
if(i!=0&&nums[i]==nums[i-1]) continue;
int l = i+1,r = nums.length-1;
while(l<r){
int sum = nums[i]+nums[l]+nums[r];
if(sum==0){
ans.add(Arrays.asList(nums[i],nums[l],nums[r]));
while(l<r && nums[l]==nums[++l]);
while(l<r && nums[r]==nums[--r]);
}else if(sum<0){
while(l<r && nums[l]==nums[++l]);
}else{
while(l<r && nums[r]==nums[--r]);
}
}
}
return ans;
}
}