15.三数之和

2024/3/12

# Heading

    15.三数之和 (opens new window)

    Tags: algorithms adobe amazon bloomberg facebook microsoft array two-pointers

    Langs: c cpp csharp dart elixir erlang golang java javascript kotlin php python python3 racket ruby rust scala swift typescript

    • algorithms
    • Medium (37.75%)
    • Likes: 6735
    • Dislikes: -
    • Total Accepted: 1.7M
    • Total Submissions: 4.5M
    • Testcase Example: '[-1,0,1,2,-1,-4]'

    给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

    你返回所有和为 0 且不重复的三元组。

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

     

     

    示例 1:

    输入:nums = [-1,0,1,2,-1,-4]
    输出:[[-1,-1,2],[-1,0,1]]
    解释:
    nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
    nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
    nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
    不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
    注意,输出的顺序和三元组的顺序并不重要。
    

    示例 2:

    输入:nums = [0,1,1]
    输出:[]
    解释:唯一可能的三元组和不为 0 。
    

    示例 3:

    输入:nums = [0,0,0]
    输出:[[0,0,0]]
    解释:唯一可能的三元组和为 0 。
    

     

    提示:

    • 3 <= nums.length <= 3000
    • -105 <= nums[i] <= 105
    /*
     * @lc app=leetcode.cn id=15 lang=javascript
     *
     * [15] 三数之和
     * 双指针 第二层用for循环
     */
    
    // @lc code=start
    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
    var threeSum = function(nums) {
        const n = nums.length
        if (n < 3) {
            return false
        }
    
        const result = []
        const sortedNums = nums.sort((x, y) => (x === y ? 0 : x > y ? 1 : -1))
    
        // 第二层用for循环
        for (let i = 0; i < n; i++) {
            if (i > 0 && sortedNums[i] === sortedNums[i - 1]) {
                continue
            }
    
            let k = n - 1
            let target = -sortedNums[i]
            for (let j = i + 1; j < n; j++) {
                if (j > i + 1 && sortedNums[j] === sortedNums[j - 1]) {
                    continue
                }
    
                while (j < k && sortedNums[j] + sortedNums[k] > target) {
                    k--
                }
    
                if (j === k) {
                    break
                }
    
                if (sortedNums[k] + sortedNums[j] === target) {
                    result.push([sortedNums[i], sortedNums[j], sortedNums[k]])
                }
            }
        }
    
        return result
    }
    // @lc code=end
    
    // @after-stub-for-debug-begin
    module.exports = threeSum
    // @after-stub-for-debug-end
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    /*
     * @lc app=leetcode.cn id=15 lang=javascript
     *
     * [15] 三数之和
     * 双指针 第二层用while循环
     */
    
    // @lc code=start
    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
    var threeSum = function(nums) {
        const n = nums.length
        if (n < 3) {
            return false
        }
    
        const result = []
        const sortedNums = nums.sort((x, y) => (x === y ? 0 : x > y ? 1 : -1))
    
        for (let i = 0; i < n; i++) {
            if (i > 0 && sortedNums[i] === sortedNums[i - 1]) {
                continue
            }
    
            // 第二层用while循环
            let j = n - 1
            let k = i + 1
            while (k < j) {
                const sum = sortedNums[i] + sortedNums[k] + sortedNums[j]
                if (sum === 0) {
                    result.push([sortedNums[i], sortedNums[k], sortedNums[j]])
                }
    
                if (sum > 0) {
                    j--
                    while (sortedNums[j + 1] === sortedNums[j]) {
                        j--
                    }
                } else {
                    k++
                    while (sortedNums[k - 1] === sortedNums[k]) {
                        k++
                    }
                }
            }
        }
    
        return result
    }
    // @lc code=end
    
    // @after-stub-for-debug-begin
    module.exports = threeSum
    // @after-stub-for-debug-end
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56