JS算法之三数之和

492 阅读1分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

三数之和

Hot100 15.三数之和

难度:中等

题目:leetcode-cn.com/problems/3s…

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

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

示例1:

 输入:nums = [-1,0,1,2,-1,-4]
 输出:[[-1,-1,2],[-1,0,1]]

示例2:

 输入:nums = []
 输出:[]

示例3:

 输入:nums = [0]
 输出:[]

提示:

  • 0 <= nums.length <= 3000
  • -10^5 <= nums[i] <= 10^5

题解

排序+双指针法

  1. 当 n < 3或数组为null​时,返回[]

  2. 对数组进行排序。

  3. 遍历排序后的数组:

    • 先固定一个数nums[i],再使用左右指向nums[i]后面的两端,数字分别为nums[L]和nums[R],计算三个数的和sum判断是否满足为0,满足则添加进结果数组res。
    • 如果nums[i]大于0,则nums[i]大于0,则三数之和必然无法等于0,结束循环。
    • 如果nums[i] == nums[i - 1],则说明该数字重复,会导致结果重复,所以应该跳过。
    • 当sum == 0时,nums[L] == nums[L+1]会导致结果重复,需跳过,L++。
    • 当sum == 0时,nums[R] == nums[R+1]会导致结果重复,需跳过,R--。
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    let res = [];
    const len = nums.length;
    if(!nums || len < 3) return res;
    nums.sort((a,b) => a - b);

    for(let i = 0; i < len; i++){
        if(nums[i] > 0) break;
        if(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){
                res.push([nums[i],nums[L],nums[R]]);
                // 去重
                while(L<R && nums[L] === nums[L+1]) L++;
                while(L<R && nums[L] === nums[R-1]) R--;
                L++;R--;
            }
            else if(sum < 0) L++;
            else if(sum > 0) R--;
        }
    }
    return res;
};

时间复杂度:O(n^2)

空间复杂度:O(1)


坚持每日一练!前端小萌新一枚,希望能点个+在看哇~