Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 62bc621

Browse files
Merge pull request youngyangyang04#2526 from WanpengXu/master
fix: 修正 0015.三数之和.md 中的严重表述错误
2 parents f955738 + 34d28a9 commit 62bc621

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

‎problems/0015.三数之和.md‎

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
### 哈希解法
3636

37-
两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。
37+
两层for循环就可以确定 两个数值,可以使用哈希法来确定 第三个数 0-(a+b) 或者 0 - (a + c) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。
3838

3939
把符合条件的三元组放进vector中,然后再去重,这样是非常费时的,很容易超时,也是这道题目通过率如此之低的根源所在。
4040

@@ -48,35 +48,41 @@
4848
```CPP
4949
class Solution {
5050
public:
51+
// 在一个数组中找到3个数形成的三元组,它们的和为0,不能重复使用(三数下标互不相同),且三元组不能重复。
52+
// b(存储)== 0-(a+c)(检索)
5153
vector<vector<int>> threeSum(vector<int>& nums) {
5254
vector<vector<int>> result;
5355
sort(nums.begin(), nums.end());
54-
// 找出a + b + c = 0
55-
// a = nums[i], b = nums[j], c = -(a + b)
56+
5657
for (int i = 0; i < nums.size(); i++) {
57-
// 排序之后如果第一个元素已经大于零,那么不可能凑成三元组
58-
if (nums[i] > 0) {
58+
// 如果a是正数,a<b<c,不可能形成和为0的三元组
59+
if (nums[i] > 0)
5960
break;
60-
}
61-
if (i > 0 && nums[i] == nums[i - 1]) { //三元组元素a去重
61+
62+
// [a, a, ...] 如果本轮a和上轮a相同,那么找到的b,c也是相同的,所以去重a
63+
if (i > 0 && nums[i] == nums[i - 1])
6264
continue;
63-
}
65+
66+
// 这个set的作用是存储b
6467
unordered_set<int> set;
65-
for (int j = i + 1; j < nums.size(); j++) {
66-
if (j > i + 2
67-
&& nums[j] == nums[j-1]
68-
&& nums[j-1] == nums[j-2]) { // 三元组元素b去重
68+
69+
for (int k = i + 1; k < nums.size(); k++) {
70+
// 去重b=c时的b和c
71+
if (k > i + 2 && nums[k] == nums[k - 1]&& nums[k - 1] == nums[k - 2])
6972
continue;
73+
74+
// a+b+c=0 <=> b=0-(a+c)
75+
int target = 0 - (nums[i] + nums[k]);
76+
if (set.find(target) != set.end()) {
77+
result.push_back({nums[i], target, nums[k]}); // nums[k]成为c
78+
set.erase(target);
7079
}
71-
int c = 0 - (nums[i] + nums[j]);
72-
if (set.find(c) != set.end()) {
73-
result.push_back({nums[i], nums[j], c});
74-
set.erase(c);// 三元组元素c去重
75-
} else {
76-
set.insert(nums[j]);
80+
else {
81+
set.insert(nums[k]); // nums[k]成为b
7782
}
7883
}
7984
}
85+
8086
return result;
8187
}
8288
};

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /