一 题目:
二 思路
- a+b+c=0, a=-(b+c),a确定,往后的数字双指针找 b+c
- 先排序,外面一层循环确定当前数的值
- 去重,
三 代码
public List<List<Integer>> threeSum(int[] nums){
List<List<Integer>> res=new LinkedList<>();
if (nums.length<1){
return res;
}
//a=-(b+c)
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
//特殊情况1:如果当前元素的值 > 0,则后面的三数之和一定大于0(因为数组递增)
if (nums[i]>0){
return res;
}
// 特殊情况2:如果前一个元素 == 当前元素,那么固定前一个元素得到的结果肯定包含了现在的情况
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
//在后面的数里找到和为-nums[i]的数
int l=i+1;
int r=nums.length-1;
while (l<r){
if (nums[l]+nums[r]== (-nums[i])){
res.add(Arrays.asList(nums[i],nums[l],nums[r]));
// 特殊情况3 直接走到最后一个相同的数那里,避免多次循环
while (l+1<nums.length && nums[l+1]==nums[l]){
l++;
}
while (r-1>0 && nums[r-1]==nums[r]){
r--;
}
//都变动加加减减,因为一个变多另一个必须变少才能继续匹配
l++;
r--;
}else if (nums[l]+nums[r]> (-nums[i])){
r--;
}else if (nums[l]+nums[r]< (-nums[i])){
l++;
}
}
}
return res;
}