forked from kamyu104/LeetCode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
next-greater-numerically-balanced-number.cpp
61 lines (59 loc) · 2.44 KB
/
next-greater-numerically-balanced-number.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
53
54
55
56
57
58
59
60
61
// Time: O(logc) = O(1)
// Space: O(c) = O(1)
class Solution {
public:
int nextBeautifulNumber(int n) {
// precomputed by generating all balanced's permutations in solution2
static const vector<int> candidates = {
1, 22, 122, 212, 221, 333 , 1333, 3133, 3313, 3331,
4444, 14444, 22333, 23233, 23323, 23332, 32233, 32323, 32332, 33223,
33232, 33322, 41444, 44144, 44414, 44441, 55555, 122333, 123233, 123323,
123332, 132233, 132323, 132332, 133223, 133232, 133322, 155555, 212333, 213233,
213323, 213332, 221333, 223133, 223313, 223331, 224444, 231233, 231323, 231332,
232133, 232313, 232331, 233123, 233132, 233213, 233231, 233312, 233321, 242444,
244244, 244424, 244442, 312233, 312323, 312332, 313223, 313232, 313322, 321233,
321323, 321332, 322133, 322313, 322331, 323123, 323132, 323213, 323231, 323312,
323321, 331223, 331232, 331322, 332123, 332132, 332213, 332231, 332312, 332321,
333122, 333212, 333221, 422444, 424244, 424424, 424442, 442244, 442424, 442442,
444224, 444242, 444422, 515555, 551555, 555155, 555515, 555551, 666666, 1224444
};
return *upper_bound(cbegin(candidates), cend(candidates), n);
}
};
// Time: O(l * c) = O(1), c is the count of all balanced's permutations, l is the max length of permutations
// Space: O(l * b) = O(1), b is the count of balanced
class Solution2 {
public:
int nextBeautifulNumber(int n) {
// obtained by manually enumerating min number of permutations in each length
static const vector<int> balanced = {
1,
22,
122, 333,
1333, 4444,
14444, 22333, 55555,
122333, 155555, 224444, 666666
};
const auto& s = to_string(n);
int result = 1224444;
for (const auto& i : balanced) {
auto x = to_string(i);
if (size(x) < size(s)) {
continue;
}
if (size(x) > size(s)) {
result = min(result, stoi(x));
continue;
}
while (true) {
if (x > s) {
result = min(result, stoi(x));
}
if (!next_permutation(begin(x), end(x))) {
break;
}
}
}
return result;
}
};