算法笔记23:3Sum

345 阅读1分钟

15. 3Sum

老朋友 3Sum 哈哈。这个题目主要的点在于:

  • 排序优化计算,可以跳过所有大于 0 的元素早退
  • 双指针向中间移动寻找目标
  • 有一个细节需要注意的就是,连续的相同的数字需要处理跳过的部分

代码如下:

const threeSum = (nums) => {
    nums.sort((a, b) => a - b);
    const res = [];
    
    for (let i = 0; i < nums.length; i++) {
        const curr = nums[i];
        // skip all numbers if they are all positive
        if (curr > 0) {
            break;
        }
        
        // need to skip all the same numbers
        if (i === 0 || (i > 0 && nums[i] !== nums[i-1])) {
            const remain = 0 - curr;
            let l = i + 1;
            let r = nums.length - 1;
            while(l < r) {
                if (nums[l] + nums[r] === remain) {
                    res.push([curr, nums[l], nums[r]]);
                    // similar here, skip all the same numbers
                    while(l < r && nums[l] === nums[l + 1]) l++;
                    while(l < r && nums[r] === nums[r - 1]) r--;
                    l++;
                    r--;
                } else if (nums[l] + nums[r] < remain) {
                    l++;
                } else {
                    r--;
                }
            }
        }
    }
    
    return res;
}