LeetCode 热题 HOT 100 15. 三数之和

272 阅读1分钟

题目

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

题解

排序 + 双指针

  1. 三数之和 = 按住一个数 + 另外两个数移动
  2. 由于我们在移动时候,需要判断三数之后与0的关系,因此需要先排序


/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    const output = []
    const len = nums.length
    if (len <= 2) return output
    nums.sort((a, b) => a - b)
    for (let i = 0; i <= len - 3; i++) {
        if (nums[i] > 0 || (nums[i] === nums[i-1])) { continue }
        let l = i + 1
        let r = len - 1
        while(l < r) {
            const sum = nums[i] + nums[l] + nums[r]
            if (sum === 0) {
                output.push([nums[i], nums[l], nums[r]])
                while(l < r && nums[l] === nums[l+1]) {
                    l += 1
                }
                while(l < r && nums[r] === nums[r-1]) {
                    r -= 1
                }
                l++
                r--
            } else if (sum < 0) {
                l++
            } else {
                r--
            }
        }
    }
    return output
};

// 时间复杂度:O(N^2)
// 空间复杂度:O(\log N)

ps: 欢迎关注我的公众号 xyz编程日记,不介意帮忙点个👍,点个在看。