链接:
leetcode-cn.com/problems/3s…
思路
/*
* 思路:
* 1. 先排序,然后再遍历数组,以 i 为第一个基准点
* 2. i < nums.length - 2,因为 1 2 3 4,假如为 2 为基点的时候,那么 肯定后面只可能是 3 4,不然就凑不够 3 个数字
* 3. 比如基点为 1 的时候,双指针分别指向 2 和 4,不断收缩,假如 基点 + 指针 start + 指针 end < 0 ,那么就代表需要一个
* 更大的数,那么就是 start ++, 反而就是 end --,假如已经和为 0 ,那么推入结果数组中,start ++, end --;
* 4. 在拿到结果之后,需要做去重,比如 -5222333,第一次拿到 [-5, 2, 3],那么假如 start ++ end -- 之后,还是 -5 , 2 ,3
* 那么就需要做去重了,所以需要 start 一直 ++ 和 end 一直 --,直到上一个 start 不等于 下一个 start,end 亦然;
* 5. 在 i 本次遍历完之后,进入到下一个 i,那么就需要判断这个 i 和上一个 i 的值是不是一样,因为假如是一样的话,比如 -1, -1, 1, 0
* 那么就会有重复的 -1, 1, 0 两个结果,所以也要判断前后两个 i 的值是不是一样的,是的话跳过本次循环
* */
var threeSum = function(nums) {
if (nums.length < 3) return []
let ret = []
nums.sort((a, b) => a - b)
for (let i = 0
let start = i + 1
let end = nums.length - 1
if (i > 0 && nums[i] === nums[i - 1]) continue
while (start < end) {
if (nums[i] + nums[start] + nums[end] < 0) {
start ++
} else if (nums[i] + nums[start] + nums[end] > 0) {
end --
} else {
ret.push([nums[i], nums[start], nums[end]])
start ++
end --
while (start < end && nums[start] === nums[start - 1]) start ++
while (start < end && nums[end] === nums[end + 1]) end --
}
}
}
return ret
}
console.log(threeSum([-1,0,1,2,-1,-4]))