【leetcode】15. 三数之和

93 阅读1分钟

leetcode-15.png

暴力破解的话,3层循环,肯定是不是这个目的,这里需要用到3指针来达到目的。
对数组进行排序后,在来移动指针。

固定i指针,k、j指针在后面进行收缩,这里要注意排除相同的答案,所以第6、13、14行代码是用来进行排除相同答案的

错误代码

这里存在的主要问题是去重,这里在未进入循环之前,就已经去重了,导致一些正确结果不会push到结果之中

var threeSum = function (nums) {
    nums.sort((a, b) => a - b);
    let n = nums.length;
    let res = [];
    for (let i = 0; i < n; ++i) {
        if (i > 0 && nums[i] === nums[i - 1]) continue;
        let k = i + 1,
            j = n - 1;
        while (k < n && nums[k] === nums[k + 1]) k++;
        while (j < n && nums[j] === nums[j - 1]) j--;
        while (k < j) {
            let sum = nums[i] + nums[k] + nums[j];
            if (sum === 0) {
                res.push([nums[i], nums[k], nums[j]]);
                k++;
                j--;
            } else if (sum > 0) {
                j--;
            } else {
                k++;
            }
        }
    }
    return res;
};

正确代码

var threeSum = function (nums) {
    let n = nums.length
    nums.sort((a, b) => a - b)
    let res = []
    for (let i = 0; i < n; ++i) {
        if (i > 0 && nums[i] === nums[i - 1]) continue
        let k = i + 1
        let j = n - 1
        while (k < j) {
            let sum = nums[i] + nums[j] + nums[k]
            if (sum === 0) {
                res.push([nums[i], nums[k], nums[j]])
                while (k < j && nums[k] === nums[k + 1]) k++
                while (k < j && nums[j] === nums[j - 1]) j--
                k++
                j--
            } else if (sum > 0) {
                j--
            } else {
                k++
            }
        }
    }
    return res
};