【算法修炼-数组】leetcode13. 三数之和(js)

868 阅读1分钟

题目链接: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 = []

输出:[]

  • 提示:

0 <= nums.length <= 3000

-105 <= nums[i] <= 105

解题

最优解法:先排序,再利用双指针移动法,时间复杂度 o(n)

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    // 对数组进行排序
    let arrSOrt = nums.sort((a,b) => a - b);
    // 结果数组
    let result = [];
    for (let i = 0; i<nums.length; i++) {
        // 去重
        if (i > 0 && arrSOrt[i] === arrSOrt [i - 1])
            continue;
        let left = i + 1;
        let right = nums.length - 1;
        while(left < right) {
            let sum = arrSOrt[i] + arrSOrt[left] + arrSOrt[right];
            if (sum === 0) {
                result.push([arrSOrt[i], arrSOrt[left], arrSOrt[right]]);
                // 去重
                while(left < right && arrSOrt[left] === arrSOrt[left+1]) left++;
                while(left < right && arrSOrt[right] === arrSOrt[right - 1]) right--;
                left++;
                right--;
            } else if (sum < 0) {
                left++;
            } else {
                right--;
            }
        }
    }
    return result;
};

总结

该题目容易忽略去重,一次性写对还是有点挑战。

算法修炼github:github.com/mengmengzp/…