-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathunique-3-digit-even-numbers.cpp
52 lines (50 loc) · 1.38 KB
/
unique-3-digit-even-numbers.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
50
51
52
// Time: O(n)
// Space: O(1)
// freq table, combinatorics
class Solution {
public:
int totalNumbers(vector<int>& digits) {
vector<int> cnt(10);
for (const auto& x : digits) {
++cnt[x];
}
int odd = 0, even = 0;
for (int i = 0; i < size(cnt); ++i) {
if (cnt[i] == 0) {
continue;
}
if (i % 2) {
++odd;
} else {
++even;
}
}
int result = 0;
// 3 same digits
for (int i = 2; i < size(cnt); i += 2) {
if (cnt[i] >= 3) {
++result; // eee
}
}
// 3 distinct digits
result += even * (odd + even - 1) * (odd + even - 2); // xye
if (cnt[0]) {
result -= 1 * (even - 1) * (odd + even - 2); // 0xe
}
// 2 same digits, 1 different digit
for (int i = 0; i < size(cnt); ++i) {
if (cnt[i] < 2) {
continue;
}
if (i == 0) {
result += (odd + even) - 1; // x00
} else if (i % 2) {
result += even; // ooe
} else {
result += 3 * (even - 1) - (cnt[0] != 0 ? 1 : 0); // eeE, eEe, Eee excluding 0ee
result += 2 * odd; // eoe, oee
}
}
return result;
}
};