2048.下一个更大的数值平衡数
【LetMeFly】2048.下一个更大的数值平衡数
力扣题目链接:https://leetcode.cn/problems/next-greater-numerically-balanced-number/
如果整数 x
满足:对于每个数位 d
,这个数位 恰好 在 x
中出现 d
次。那么整数 x
就是一个 数值平衡数 。
给你一个整数 n
,请你返回 严格大于 n
的 最小数值平衡数 。
示例 1:
输入:n = 1 输出:22 解释: 22 是一个数值平衡数,因为: - 数字 2 出现 2 次 这也是严格大于 1 的最小数值平衡数。
示例 2:
输入:n = 1000 输出:1333 解释: 1333 是一个数值平衡数,因为: - 数字 1 出现 1 次。 - 数字 3 出现 3 次。 这也是严格大于 1000 的最小数值平衡数。 注意,1022 不能作为本输入的答案,因为数字 0 的出现次数超过了 0 。
示例 3:
输入:n = 3000 输出:3133 解释: 3133 是一个数值平衡数,因为: - 数字 1 出现 1 次。 - 数字 3 出现 3 次。 这也是严格大于 3000 的最小数值平衡数。
提示:
0 <= n <= 106
方法一:枚举
我们可以很方便地写一个函数用来判断一个数$n$是否为“数值平衡数”。
只需要取出这个数的每一位并统计出现次数,从0到10遍历,如果出现次数不等于这个数就返回false,否则返回true。
接下来从给定的$n$的下一个数开始枚举,直到枚举到了“数值平衡数”为止。
- 时间复杂度:不易计算,但是能过(方法二中也可以看出无论给定n是多少,枚举量都不超过557778)
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
Python
1 |
|
方法二:打表
方法一中我们实现了“判断一个数是否为数值平衡数的函数”,因此我们可以写一个简单的程序,预先将所有可能用到的“数值平衡数”存下来:
1 |
|
上述代码不重要,反正只要能得到下面的这个表就好:
1 |
|
这是从1到1224444的所有“数值平衡数”。有了这张表,不论给你的n等于几,你都可以通过二分等方式在极短的时间内找到第一个大于n的“数值平衡数”。
- 时间复杂度$\log len(Biao)$,其中表的大小$len(Biao)=110$
- 空间复杂度$O(len(Biao))$
AC代码
C++
1 |
|
Python
1 |
|
同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/134900679
2048.下一个更大的数值平衡数
https://blog.letmefly.xyz/2023/12/09/LeetCode 2048.下一个更大的数值平衡数/