var nums = [-1, 0, 1, 2, -1, -4]
function threeSum(nums) {
let res = []
nums = nums.sort((a, b) => a - b)
console.log(nums)
let len = nums.length
// 这里遍历到倒数第三个就可以了,因为左右指针会遍历后面的两个
for (let i = 0; i < len - 2; i++) {
// 左指针
let j = i + 1
// 右指针
let k = len - 1
// console.log(nums[i], nums[i - 1])
// 遇到重复的,就跳过
if (i > 0 && nums[i] === nums[i - 1]) {
continue
}
while (j < k) {
// 左指针前进
if (nums[i] + nums[j] + nums[k] < 0) {
j++
// 判断左指针前进前后重复的
while (j < k && nums[i] === nums[j - 1]) {
j++
}
}
// 右指针后退
else if (nums[i] + nums[j] + nums[k] > 0) {
k--
// 判断右指针后退时前后重复的
while (j < k && nums[k] === nums[k - 1]) {
k--
}
}
else {
// 满足条件push到数组
res.push([nums[i], nums[j], nums[k]])
j++
k--
// 如果左指针元素重复,则跳过
while (j < k && nums[i] === nums[i - 1]) {
j++
}
// 如果右指针元素重复,则跳过
while (j < k && nums[k] === nums[k - 1]) {
k--
}
}
}
}
return res
}
console.log(threeSum(nums))
// [ [ -1, -1, 2 ], [ -1, 0, 1 ] ]