题目
算法
对撞指针。双指针的一种,特点是一前一后,相向而行,两个指针相遇时为终点
code
var threeSum = function(nums) {
let len = nums.length
nums.sort((a,b) => a-b)
// 元素不足3个, 或 最小值>0 或 最大值<0,不会出现满足条件的情况
if(len<3 || nums[0]>0 || nums[len-1]<0){
return []
}
if(nums[0]==0 && nums[len-1]==0){
return [[0,0,0]]
}
let res = []
for(let i=0; i<len-2; i++){
// 固定数字的所有情况被找完后, 则跳过重复的固定数字
if(i && nums[i] == nums[i-1]){
continue
}
// 固定的的最小数>0, 不会再有满足条件的情况出现了
if(nums[i]>0){
break;
}
// i是当前固定的数, left左指针, right右指针
let left = i+1
let right = len-1
while(left < right){
// 和偏小则左指针右移取更大值
let sum = nums[i]+nums[left]+nums[right]
if(sum < 0){
left++
// 跳过重复
while(left<right && nums[left]===nums[left-1]){
left++
}
}else if(sum>0){
// 和偏大则有指针左移取更小值
right--
while(right>left && nums[right]===nums[right+1]){
right--
}
}else{
// 满足条件
res.push([nums[i], nums[left], nums[right]])
left++; right--
while(left<right && nums[left]===nums[left-1]){
left++
}
while(right>left && nums[right]===nums[right+1]){
right--
}
}
}
}
return res
};