三数之和

134 阅读1分钟

思路:

1.先排序

2.首先判断nums数组长度,如果小于3 或者 升序排序后第一个元素大于0 则直接返回空数组

3.left必须小于right

4.三数之和等于0就push,小于0就start++,大于0就end--

4.判断left++和right--是不是一样,一样就继续++和--

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
    // 采用双指针方法
    // 1、首先判断nums数组长度,如果小于3 或者 升序排序后第一个元素大于0 则直接返回空数组
    let res = []
    nums.sort((a, b) => a - b)
    if (nums.length < 3 || nums[0] > 0) return res
    // 2、对nums数组进行for循环
    for (let i = 0; i < nums.length; i++) {
        // 3、对连续相同的元素去重 (第一个元素不执行)
        if (i > 0 && nums[i] === nums[i - 1]) continue
        // 4、定义左指针
        let Left = i + 1
        // 5、定义右指针
        let Right = nums.length - 1
        // 6、指定当前元素为a 进行while循环判断b和c 条件是Left 小于 Right 由两边向中间夹
        while (Left < Right) {
            let num = nums[i] + nums[Left] + nums[Right]
            // 7、如果num 三数之和等于0 则push到结果数组res中,并且要再判断下一元素是否与当前元素相同
            if (num === 0) {
                res.push([nums[i], nums[Left], nums[Right]])
                // 8、对左指针的下一元素 也就是左指针右边的元素 进行去重处理
                while (Left < Right && nums[Left] === nums[Left + 1]) Left++
                // 9、对右指针的下一元素 也就是右指针左边的元素 进行去重处理
                while (Left < Right && nums[Right] === nums[Right - 1]) Right--
                // 10、如果没有左右都没有重复 则左边指针向右移动一个  右边指针向左移动一个
                Left++
                Right--
            }
            // 11、如果num 三数之和小于0 则左指针向右移动一个
            else if (num < 0) {
                Left++
            }
            // 12、如果num 三数之和大于0 则右指针向左移动一个
            else if (num > 0) {
                Right--
            }
        }
    }
    // 13、执行完循环,最后返回结果数组 res
    return res
}