Skip to content

力扣链接:15.三数之和

难度:⭐⭐

解题关键词:双指针

解题思路:首先将数组进行排序,如果第一个元素已经大于 0,直接 break,因为不存在有 3 个数之和为 0,之后对于后面的我们应用首尾指针,如果碰到之和等于 0,我们就加入结果数组中,如果大于 0,我们将尾指针往前面移动,如果小于 0,我们把首指针往后移动。

typescript
function threeSum(nums: number[]): number[][] {
  const len = nums.length;
  if (len < 3) return [];

  const result = [];
  nums.sort((a, b) => a - b);

  for (let i = 0; i < len; i++) {
    if (nums[i] > 0) break;

    // 如果元素重复,那么 continue
    if (i > 0 && nums[i] === nums[i - 1]) continue;

    // 在后面的元素中,应用双指针
    let l = i + 1;
    let r = len - 1;
    while (l < r) {
      const sum = nums[l] + nums[r] + nums[i];

      // 满足条件
      if (sum === 0) {
        result.push([nums[i], nums[l], nums[r]]);

        // 把重复的元素过滤掉
        while (l < r && nums[l] === nums[l + 1]) l++;
        while (l < r && nums[r] === nums[r - 1]) r--;

        l++;
        r--;
      } else if (sum > 0) {
        r--;
      } else {
        l++;
      }
    }
  }

  return result;
}