# 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
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吧