7. 三数之和【LC15】

94 阅读1分钟

题目:

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

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

示例 1:

输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]

关键思路:

image.png

image.png

image.png

image.png

本题的关键理解点在于:

1)排序避免重复计算

2)三数和 = cur + 求两数和

3)cur 为1的时候,求两数和的范围为[cur+1, len-1],类似排列组合。1,2,3 2,1,3是一样的

关键点:答案中不可以包含重复的三元组,靠排序跳过循环来规避。

解:

var threeSum = function (nums) {
  if (!nums || nums.length < 3) {
    return [];
  }
  const res = [];
  nums.sort((a, b) => a - b)
  for (let i = 0; i < nums.length; i++) {

    if (nums[i] > 0) { //如果当前值大于0,由于升序,不会再存在解。
      return res;
    }
    if (i > 0 && nums[i] === nums[i - 1]) { // 如果当前值和当前值前一个值相等,直接跳过
      continue
    }
    let l = i + 1;
    let r = nums.length - 1;
    // 对于每一个当前值,向左向右找
    while (l < r) {
      if (nums[i] + nums[l] + nums[r] === 0) {
        res.push([nums[i], nums[l], nums[r]]);
        // l指针右移
        // r指针左移
        // 注意,规避相同值,继续找
        while (l < r && nums[l] === nums[l + 1]) {
          ++l;
        }
        while (l < r && nums[r] === nums[r - 1]) {
          --r;
        }
        ++l;
        --r;
      } else if (nums[i] + nums[l] + nums[r] > 0) {
        // cur +  min + R > 0, R值大了
        r--;
      } else {
        l++;
      }
    }

  }
  return res;
};

———— 前端、Javascript实现、算法、刷题、leetcode