# 15 三数之和

# 题目链接

# 难度:中等

#

#

#

#

#

#

#

#

#

#

#

#

#

#

# 代码:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
  let ans = [];
  const len = nums.length;
  if (nums == null || len < 3) return ans;
  nums.sort((a, b) => a - b); // 排序
  for (let i = 0; i < len; i++) {
    if (nums[i] > 0) break; // 如果当前数字大于0,则三数之和一定大于0,所以结束循环
    if (i > 0 && nums[i] === nums[i - 1]) continue; // 当前值跟上一个值重复 上面左右指针已经相加过 会导致结果重复 跳过后面的
    let L = i + 1; // 左指针比当前值大
    let R = len - 1; // 右指针
    while (L < R) {
      // 当前值 穷尽可能为0
      const sum = nums[i] + nums[L] + nums[R];
      if (sum == 0) {
        ans.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) L++;
      //小于0 左侧值过小
      else if (sum > 0) R--; // 大于0 右侧值过大
    }
  }
  return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 鼓励我一下:

觉得还不错的话,给我的项目点个star

# 点个Star支持我一下~

最后更新时间: 7/2/2020, 4:27:35 PM