Tcdian / keep

今天不想做,所以才去做。
MIT License
5 stars 1 forks source link

15. 3Sum #209

Open Tcdian opened 4 years ago

Tcdian commented 4 years ago

15. 3Sum

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

Example

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

Note

Tcdian commented 4 years ago

Solution

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    const result = [];
    const sortedNums = [...nums].sort((a, b) => a - b);
    for (let i = 0; i < sortedNums.length - 2; i++) {
        if (sortedNums[i] > 0) {
            break;
        }
        if (i > 0 && sortedNums[i] === sortedNums[i - 1]) {
            continue;
        }
        let left = i + 1;
        let right = sortedNums.length - 1;
        while (left < right) {
            if (left > i + 1 && sortedNums[left] === sortedNums[left - 1]) {
                left++;
                continue;
            }
            if (
                right < sortedNums.length - 1
                && sortedNums[right] === sortedNums[right + 1]
            ) {
                right--;
                continue;
            }
            if (sortedNums[i] + sortedNums[left] + sortedNums[right] < 0) {
                left++;
            } else if (sortedNums[i] + sortedNums[left] + sortedNums[right] > 0) {
                right--;
            } else {
                result.push([sortedNums[i], sortedNums[left], sortedNums[right]]);
                left++;
                right--;
            }
        }
    }
    return result;
};
function threeSum(nums: number[]): number[][] {
    const result: number[][] = [];
    const sortedNums = [...nums].sort((a, b) => a - b);
    for (let i = 0; i < sortedNums.length - 2; i++) {
        if (sortedNums[i] > 0) {
            break;
        }
        if (i > 0 && sortedNums[i] === sortedNums[i - 1]) {
            continue;
        }
        let left = i + 1;
        let right = sortedNums.length - 1;
        while (left < right) {
            if (left > i + 1 && sortedNums[left] === sortedNums[left - 1]) {
                left++;
                continue;
            }
            if (
                right < sortedNums.length - 1
                && sortedNums[right] === sortedNums[right + 1]
            ) {
                right--;
                continue;
            }
            if (sortedNums[i] + sortedNums[left] + sortedNums[right] < 0) {
                left++;
            } else if (sortedNums[i] + sortedNums[left] + sortedNums[right] > 0) {
                right--;
            } else {
                result.push([sortedNums[i], sortedNums[left], sortedNums[right]]);
                left++;
                right--;
            }
        }
    }
    return result;
}