forked from UNN-ITMM-Software/advanced_cxx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sidnev_unordered_map.cpp
49 lines (41 loc) · 1.03 KB
/
sidnev_unordered_map.cpp
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Solution {
public:
void process(vector<vector<int>>& out, const unordered_map<int, int>& m, int i, int j, int j_count) {
if (i == j && j_count == 1)
return;
int sum = i + j;
auto k = m.find(-sum);
bool add = false;
if (k != m.end()) {
if (k->first < j)
return;
if (i == j) {
if (k->first > j || k->first == j && j_count >= 3) {
add = true;
}
} else {
if (k->first > j || k->first == j && j_count >= 2) {
add = true;
}
}
if (add) {
out.emplace_back(initializer_list<int>({i, j, k->first}));
}
}
}
vector<vector<int>> threeSum(vector<int>& nums) {
unordered_map<int, int> m;
vector<vector<int>> out;
for (const int& val: nums) {
++m[val];
}
for (auto i = m.begin(); i != m.end(); ++i) {
for (auto j = m.begin(); j != m.end(); ++j) {
if (i->first <= j->first) {
process(out, m, i->first, j->first, j->second);
}
}
}
return out;
}
};