Problem: 2048. 下一个更大的数值平衡数
思路
由于 0 <= n <= 10e6
,我们也可以推测出在这期间的平衡数是很少的(条件非常苛刻),因此我们可以先找出 0 到第一个比 n 大的平衡数,再记录到表中即可。
解题方法
关于判断是否为平衡数:
/*
## 判断x是否为平衡数 ##
1. 记录每个位上的数出现的次数;
2. 出现次数若不等于位的数值则非平衡数。
*/
bool isBalance(int x) {
int map[10] = { 0 };
while (x) {
if (x%10 == 0) return false;
map[x%10]++;
x /= 10;
}
for (int i=1; i<10; i++) {
if (map[i] && map[i] != i) return false;
}
return true;
}
接着进行打表:
int main() {
vector<int> rec;
for (int i=0; i<=2000000; i++) {
if (isBalance(i)) rec.push_back(i);
}
for (auto x: rec) printf("%d, ", x);
return 0;
}
LeetCode 代码见下方 Code ↓
复杂度
时间复杂度: O ( 1 ) O(1) O(1)
空间复杂度: O ( 1 ) O(1) O(1)
Code
class Solution {
public:
int nextBeautifulNumber(int n) {
vector<int> list = {0, 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};
for (int x: list) if (x > n) return x;
return -1;
}
};