Skip to content

Commit 60a08ae

Browse files
authored
Update finding-3-digit-even-numbers.cpp
1 parent 417c326 commit 60a08ae

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

C++/finding-3-digit-even-numbers.cpp

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,45 @@
1-
// Time: O(n), n is 10^3
1+
// Time: O(1) ~ O(n), n is 10^3
22
// Space: O(1)
33

44
class Solution {
5+
public:
6+
vector<int> findEvenNumbers(vector<int>& digits) {
7+
vector<int> cnt(10);
8+
for (const auto& d : digits) {
9+
++cnt[d];
10+
}
11+
vector<int> result, curr;
12+
backtracking(&curr, &cnt, &result);
13+
return result;
14+
}
15+
16+
private:
17+
void backtracking(vector<int> *curr, vector<int> *cnt, vector<int> *result) {
18+
static const int k = 3;
19+
if (size(*curr) == k) {
20+
result->emplace_back(accumulate(cbegin(*curr), cend(*curr), 0,
21+
[](const auto& total, const auto& x) {
22+
return total * 10 + x;
23+
}));
24+
return;
25+
}
26+
for (int i = 0; i < size(*cnt); ++i) {
27+
if ((*cnt)[i] == 0 || (empty(*curr) && (i == 0)) ||
28+
(size(*curr) == k - 1 && i % 2 != 0)) {
29+
continue;
30+
}
31+
--(*cnt)[i];
32+
curr->emplace_back(i);
33+
backtracking(curr, cnt, result);
34+
curr->pop_back();
35+
++(*cnt)[i];
36+
}
37+
}
38+
};
39+
40+
// Time: O(n), n is 10^3
41+
// Space: O(1)
42+
class Solution2 {
543
public:
644
vector<int> findEvenNumbers(vector<int>& digits) {
745
unordered_map<int, int> cnt;
@@ -24,7 +62,7 @@ class Solution {
2462

2563
// Time: O(1) ~ O(n), n is 10^3
2664
// Space: O(1)
27-
class Solution2 {
65+
class Solution3 {
2866
private:
2967
struct Node {
3068
int digit, cnt, left, right;
@@ -90,14 +128,14 @@ class Solution2 {
90128
(*digit_cnt_list)[(*digit_cnt_list)[i].right].left = i;
91129
}
92130
}
93-
++((*digit_cnt_list)[i]).cnt;
131+
++(*digit_cnt_list)[i].cnt;
94132
}
95133
}
96134
};
97135

98136
// Time: O(1) ~ O(nlogn), n is 10^3
99137
// Space: O(1)
100-
class Solution3 {
138+
class Solution4 {
101139
public:
102140
vector<int> findEvenNumbers(vector<int>& digits) {
103141
unordered_map<int, int> cnt;
@@ -142,7 +180,7 @@ class Solution3 {
142180
digit_cnt->emplace_back(digit, cnt);
143181
}
144182
swap((*digit_cnt)[i], (*digit_cnt).back());
145-
++((*digit_cnt)[i]).second;
183+
++(*digit_cnt)[i].second;
146184
}
147185
}
148186
};

0 commit comments

Comments
 (0)