Skip to content

Commit 11a884b

Browse files
committed
update
1 parent 9236c10 commit 11a884b

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

3Sum/3Sum.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,17 @@
1919
#include <iostream>
2020
#include <vector>
2121
#include <algorithm>
22+
#include <unordered_map>
2223

2324
using namespace std;
2425

2526
class Solution {
2627
public:
2728
vector<vector<int> > threeSum(vector<int> &num) {
29+
return threeSum2(num);
30+
}
31+
32+
vector<vector<int> > threeSum1(vector<int> &num) {
2833
vector<vector<int> > res;
2934
int N = num.size();
3035
if (N < 3) return res;
@@ -45,6 +50,30 @@ class Solution {
4550
}
4651
return res;
4752
}
53+
54+
vector<vector<int> > threeSum2(vector<int> &num) {
55+
vector<vector<int> > res;
56+
int N = num.size();
57+
if (N < 3) return res;
58+
unordered_multimap<int, int> tb;
59+
for (int i = 0; i < N; i++) tb.insert(make_pair(num[i], i));
60+
for (int i = 0; i < N; i++) {
61+
int target = -num[i];
62+
for (auto it1 = tb.begin(); it1 != tb.end(); it1++) {
63+
int j = it1->second;
64+
if (i == j) continue;
65+
auto range = tb.equal_range(target - it1->first);
66+
for (auto it2 = range.first; it2 != range.second; it2++) {
67+
int k = it2->second;
68+
if (j == k) continue;
69+
vector<int> path = { num[i], num[j], num[k] };
70+
sort(begin(path), end(path));
71+
if (find(begin(res), end(res), path) == end(res)) res.push_back(path);
72+
}
73+
}
74+
}
75+
return res;
76+
}
4877
};
4978

5079
int main() {

4Sum/4Sum.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,17 @@
2020
#include <iostream>
2121
#include <vector>
2222
#include <algorithm>
23+
#include <unordered_map>
2324

2425
using namespace std;
2526

2627
class Solution {
2728
public:
2829
vector<vector<int> > fourSum(vector<int> &num, int target) {
30+
return fourSum1(num, target);
31+
}
32+
33+
vector<vector<int> > fourSum1(vector<int> &num, int target) {
2934
vector<vector<int> > res;
3035
int N = num.size();
3136
if (N < 4) return res;
@@ -49,6 +54,29 @@ class Solution {
4954
}
5055
return res;
5156
}
57+
58+
vector<vector<int> > fourSum2(vector<int> &num, int target) {
59+
vector<vector<int> > res;
60+
int N = num.size();
61+
if (N < 4) return res;
62+
unordered_multimap<int, pair<int, int> > tb;
63+
for (int i = 0; i < N - 1; i++) {
64+
for (int j = i + 1; j < N; j++) {
65+
tb.insert(make_pair(num[i] + num[j], make_pair(i, j)));
66+
}
67+
}
68+
for (auto it1 = tb.begin(); it1 != tb.end(); it1++) {
69+
auto range = tb.equal_range(target - it1->first);
70+
for (auto it2 = range.first; it2 != range.second; it2++) {
71+
int a = it1->second.first, b = it1->second.second, c = it2->second.first, d = it2->second.second;
72+
if (a == c || a == d || b == c || b == d) continue;
73+
vector<int> path = { num[a], num[b], num[c], num[d] };
74+
sort(begin(path), end(path));
75+
if (find(res.begin(), res.end(), path) == res.end()) res.push_back(path);
76+
}
77+
}
78+
return res;
79+
}
5280
};
5381

5482
int main() {

0 commit comments

Comments
 (0)