15. 3Sum

Leetcode link

题目简介

/**
 * @param {number[]} nums
 * @return {number[][]}
 */

题目给我们一个数字数组 nums,要求在数组中找出三个数字之和为 0 的所有不重复的三元组

解题思路

这一题是 two sum 的加强版

我们只需要先锁定一个元素(假设是 nums[0])后,其他的部份也可以用 two sum 的双指针来处理

这题还有一个难点就是要去除重复的三元组,这个需要三个步骤来处理:

  1. 首先我们需要对数组 nums 升序排序
  2. 对于 i>0,如果出现 nums[i] === nums[i-1],则直接跳过当前的 i(i 是第一个元素的遍历下标)
  3. 当找到三元组 nums[i] + nums[left] + nums[right] === 0 时,我们需要更新 left 以及 right 两个指针,此时如果 nums[left] === nums[left - 1] 或者 nums[right] === nums[right + 1] 时,也需要跳过当前的 left 与 right

Javascript

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function (nums) {
    const res = []
    const len = nums.length
    nums.sort((a, b) => a - b)

    for (let i = 0; i < len; i++) {
        if (nums[i] > 0) {
            break;
        }
        // prevent duplicate answers
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue
        }

        const rest = -nums[i]
        let left = i + 1
        let right = len - 1
        while (left < right) {
            const twoSum = nums[left] + nums[right]

            if (twoSum > rest) {
                right--
            } else if (twoSum < rest) {
                left++
            } else {
                res.push([nums[i], nums[left], nums[right]])
                right--
                left++
                // prevent duplicate answers
                while (nums[left] === nums[left - 1] && left < right) {
                    left++
                }
                while (nums[right] === nums[right + 1] && right > left) {
                    right--
                }
            }
        }
    }

    return res
};

results matching ""

    No results matching ""