编辑代码

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 ] ]