JavaScript
常见代码片段
Threesum

三数之和

三数之和 (opens in a new tab)

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

function threeSum(nums: number[]): number[][] {
  nums.sort((a, b) => a - b);
  const len = nums.length - 1;
  const res: number[][] = [];
  for (let i = 0; i <= len; i++) {
    const v1 = nums[i];
    // 当前值大于0,后面的值都大于0,不可能相加等于0
    if (v1 > 0) {
      break;
    }
    let left = i + 1,
      right = len;
    // 去重,避免重复计算
    while (nums[i] === nums[i + 1]) {
      ++i;
    }
 
    while (left < right) {
      const sum = nums[left] + nums[right] + v1;
      if (sum === 0) {
        res.push([v1, nums[left], nums[right]]);
        --right;
        ++left;
        while (nums[left] === nums[left - 1]) {
          ++left;
        }
        while (nums[right] === nums[right + 1]) {
          --right;
        }
      } else if (sum < 0) {
        ++left;
      } else {
        --right;
      }
    }
  }
  return res;
}