15.【中等】三数之和
文章发布较早,内容可能过时,阅读注意甄别。
# 题目来源:
(题目来源 (opens new window) " 11.【中等】三数之和")
# 题目
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
1
2
3
4
5
6
7
2
3
4
5
6
7
# 分析
本题最关键的部分是去重,光去重提交,就五次,醉醉的
# 题解
方法一
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
// 第一步 从小到大排序
nums = nums.sort((a, b) => a - b);
let k = 0, res = [];
while(k < nums.length - 2) {
if(nums[k] > 0) return res;
i = k + 1, j = nums.length - 1
while(i < j) {
let su = nums[k] + nums[i] + nums[j];
if(su == 0 ) {
while (i < j && nums[i] == nums[i + 1]) i++; // 去重
while (i < j && nums[j] == nums[j - 1]) j--; // 去重
res.push([nums[k], nums[i], nums[j]])
}
if(su < 0) {
i ++
} else {
j --
}
}
k ++
while(k < nums.length - 2 && nums[k] == nums[k - 1]) {
k ++
}
}
return res;
};
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
31
32
33
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
31
32
33
输入
[0,-4,-1,-4,-2,-3,2]
输出
[[-2,0,2]]
1
2
3
4
5
6
7
2
3
4
5
6
7
上次更新: 2024/03/07, 20:33:54