15. 三数之和|刷题打卡

415 阅读1分钟

一、题目描述:

给你一个包含 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 = []
输出:[]

二、思路分析:

  1. 对数组排序
  2. 固定一个数nums[i], 然后用左右指针指向nums[i]后面的两端,分别是nums[L]和nums[R],然后判断三数之和是否等于0,如果等于0则添加进集合
  3. 如果nums[i] == nums[i - 1] 会导致重复,跳过
  4. 当 sum == 0 时,nums[L] == nums[L + 1] 则会导致结果重复,应该跳过,L++
  5. 当 sum == 0 时,nums[R] == nums[R - 1] 则会导致结果重复,应该跳过,R++

三、AC 代码:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    let list = [], len = nums.length;
    nums.sort((a, b) => a - b); // 排序
    for(let i = 0;i < len; i++) {
        if(nums[i] > 0) break;
        if(nums[i] === nums[i -1]) continue;
        let L = i + 1, R = len -1;
        while(L < R) {
            let sum = nums[i] + nums[L] + nums[R];
            if(sum === 0) {
                list.push([nums[i], 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(sum < 0) {
                L++
            } else {
                R--
            }
        }
    }
    return list;
};

四、总结:

执行结果: 通过
显示详情
执行用时: 152 ms, 在所有 JavaScript 提交中击败了 94.89% 的用户
内存消耗: 48.1 MB , 在所有 JavaScript 提交中击败了 31.88% 的用户

刷题打卡第二天,打工人加油。。。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情