Skip to content

Commit a6f1d28

Browse files
authored
15. 3Sum
1 parent a1e96d1 commit a6f1d28

File tree

1 file changed

+21
-29
lines changed

1 file changed

+21
-29
lines changed

cpp/011-020/3Sum.cpp

+21-29
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,34 @@
11
class Solution {
2-
32
public:
4-
vector<vector<int> > threeSum(vector<int> &num) {
3+
vector<vector<int>> threeSum(vector<int>& nums) {
54
vector<vector<int>> result;
6-
if (num.size() < 3) return result;
7-
8-
sort(num.begin(), num.end());
9-
int buf1(INT_MAX), buf2(INT_MAX), buf3(INT_MAX);
5+
6+
sort(nums.begin(), nums.end());
107

11-
for (int i = 0;i < num.size()-2;) {
12-
int remain = -num[i];
13-
int j = i+1;
14-
int k = num.size()-1;
8+
for (int i = 0; i < nums.size(); i++) {
9+
if (i > 0 && nums[i - 1] == nums[i]) {
10+
continue;
11+
}
1512

16-
while (j < k && j < num.size()-1) {
17-
int tmp = num[j] + num[k];
18-
if (tmp == remain) {
19-
int a[3] = {num[i], num[j], num[k]};
20-
vector<int> v(a, a+3);
21-
if (!(num[i] == buf1 && num[j] == buf2 && num[k] == buf3)) {
22-
buf1 = num[i];
23-
buf2 = num[j];
24-
buf3 = num[k];
25-
result.push_back(v);
26-
}
13+
int j = i + 1;
14+
int k = nums.size() - 1;
15+
16+
while (j < k) {
17+
int sum = nums[i] + nums[j] + nums[k];
18+
if (sum < 0) {
2719
j++;
20+
} else if (sum > 0) {
21+
k--;
22+
} else {
23+
result.push_back({nums[i], nums[j], nums[k]});
24+
while ((j + 1) < nums.size() && nums[j] == nums[j+1]) j++;
25+
j++;
26+
while ((k - 1) >= 0 && nums[k] == nums[k - 1]) k--;
2827
k--;
2928
}
30-
else if (tmp > remain) k--;
31-
else j++;
32-
}
33-
34-
do {
35-
i++;
3629
}
37-
while (i < num.size() && num[i-1] == num[i]);
3830
}
31+
3932
return result;
4033
}
41-
4234
};

0 commit comments

Comments
 (0)