三数之和
2022/06/11
示例
示例一
输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
示例二
输入:nums = [] 输出:[]
示例三
输入:nums = [0] 输出:[]
思考过程
题解参考,双指针
var threeSum = function (nums) {
    const n = nums.length
    // 先对数组进行排序方便后续操作的时候排除重复的因素
    nums = nums.sort((a, b) => a - b)
    // 用于存放所有答案的数组,答案是数组,所以这会是一个二维数组
    const ans = []
    // 头指针, 遍历出答案的第一个数字a
    for (let first = 0; first < n; first++) {
        // 由于题解不能重复,所以当第一个数字重复时则可跳过
        if (first > 0 && nums[first] === nums[first - 1]) {
            continue
        }
        // 尾指针,用于找出答案的第三个数字c
        let third = n - 1
        // 将a的取反作为b与c的两数之和
        let target = -nums[first]
        // 中间指针,遍历出答案的第二个数字b,在这个过程中也会找出数字c
        for (let second = first + 1; second < n; second++) {
            // 类似判断在上面出现过,由于题解不能重复,所以跳过
            if (second > first + 1 && nums[second] === nums[second - 1]) {
                continue
            }
            // 数组已经过排序,若b、c之和大于target,则应该将c再往前指
            while (second < third && nums[second] + nums[third] > target) {
                --third
            }
            // 指针重合了,退出循环
            if (second === third) {
                break
            }
            // 找到题解了,将题解放入ans中
            if (nums[second] + nums[third] === target) {
                ans.push([nums[first], nums[second], nums[third]])
            }
        }
    }
    return ans
};