1
- // Time: O(n), n is 10^3
1
+ // Time: O(1) ~ O( n), n is 10^3
2
2
// Space: O(1)
3
3
4
4
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 {
5
43
public:
6
44
vector<int > findEvenNumbers (vector<int >& digits) {
7
45
unordered_map<int , int > cnt;
@@ -24,7 +62,7 @@ class Solution {
24
62
25
63
// Time: O(1) ~ O(n), n is 10^3
26
64
// Space: O(1)
27
- class Solution2 {
65
+ class Solution3 {
28
66
private:
29
67
struct Node {
30
68
int digit, cnt, left, right;
@@ -90,14 +128,14 @@ class Solution2 {
90
128
(*digit_cnt_list)[(*digit_cnt_list)[i].right ].left = i;
91
129
}
92
130
}
93
- ++(( *digit_cnt_list)[i]) .cnt ;
131
+ ++(*digit_cnt_list)[i].cnt ;
94
132
}
95
133
}
96
134
};
97
135
98
136
// Time: O(1) ~ O(nlogn), n is 10^3
99
137
// Space: O(1)
100
- class Solution3 {
138
+ class Solution4 {
101
139
public:
102
140
vector<int > findEvenNumbers (vector<int >& digits) {
103
141
unordered_map<int , int > cnt;
@@ -142,7 +180,7 @@ class Solution3 {
142
180
digit_cnt->emplace_back (digit, cnt);
143
181
}
144
182
swap ((*digit_cnt)[i], (*digit_cnt).back ());
145
- ++(( *digit_cnt)[i]) .second ;
183
+ ++(*digit_cnt)[i].second ;
146
184
}
147
185
}
148
186
};
0 commit comments