题目(来源于力扣)
思路
排序+双指针+去重 解决三数之和问题
代码
var threeSum = function(nums) {
// 将数组nums升序排序
nums.sort((a,b)=>a-b);
let arr = [];
for(let i = 0;i < nums.length-2;i++){
// 左指针
let left = i+1;
// 右指针
let right = nums.length-1;
// 数组升序,如果三数中第一个数就大于0,直接返回arr
if(nums[i] > 0) return arr;
// 三数中的第一个数nums[i]去重
if(i > 0 && nums[i]==nums[i-1]) continue;
// 循环找其他两个数
while(left < right){
let sum = nums[i]+nums[left]+nums[right];
if(sum > 0){
right--;
}else if(sum < 0){
left++;
}else{
arr.push([nums[i],nums[left],nums[right]])
// 对另外两个数nums[left]和nums[right]去重
while(left < right && nums[left] == nums[left + 1]){
left++;
}
while(left < right && nums[right] == nums[right - 1]) {
right--;
}
left++;
right--;
}
}
}
return arr;
};
分析图
以nums=[-1,0,1,2,-1,-4]为例
注意点
1、对于nums[i]的去重是nums[i]==nums[i-1]而不是nums[i]==nums[i+1],防止nums=[-1,-1,2]这种情况,若为nums[i]==nums[i+1],则会跳过[-1,-1,2]这种满足条件的三元组
2、对于nums[left]和nums[right]的去重要放在arr.push()之后,防止nums=[0,0,0,0]这种会导致没有结果返回