Skip to content

Latest commit

 

History

History
102 lines (70 loc) · 1.88 KB

README.md

File metadata and controls

102 lines (70 loc) · 1.88 KB

15. 三数之和

相关标签

  • 数组
  • 双指针
  • 排序

问题描述

  1. 三数之和 - 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != 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

题解

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

    for(let i=0;i<len-2;i++) {
        const item = nums[i] 
        if(item > 0) {
          break
        }
        if(i > 0 && item === nums[i-1]) {
            continue
        }
        let l = i+1;
        let r = len-1

        while(l < r) {
            const data = item + nums[l] + nums[r]
            if(data === 0) {
                result.push([item, nums[l], nums[r]])
                while(l < r && nums[l] === nums[l+1]) l++
                while(l <r && nums[r] === nums[r-1]) r--
                l++
                r--
            } else if(data > 0) {
                r--
            } else if(data < 0){
                l++
            }

        }

    }

    return result
};