本题解的思路是通过生成所有可能的数值平衡数,然后找到第一个大于给定数n的数值平衡数。首先定义数值平衡数为数位d恰好在数字中出现d次。解题步骤如下:
1. 通过递归尝试构建所有可能的'根平衡数'。'根平衡数'是一个列表,其中的每个元素满足平衡数的条件(即元素值等于其出现次数)。
2. 从长度为len(n)的数开始,尝试构建,然后是len(n)+1。
3. 对于每个生成的'根平衡数',使用回溯法生成所有可能的排列组合,并将其转换为整数形式存储。
4. 将生成的数值平衡数排序,并找出第一个大于n的数值平衡数。
时间复杂度: O(n!)
空间复杂度: O(n!)
class Solution:
def nextBeautifulNumber(self, n: int) -> int:
n_str = str(n)
root_balanced_nums = [] # 存储'根平衡数'
balanced_nums = [] # 存储所有可能的数值平衡数
def find_root_balanced_nums(root_balanced_num, numLen):
if len(root_balanced_num) == numLen:
root_balanced_nums.append(root_balanced_num)
return
if numLen - len(root_balanced_num) < int(root_balanced_num[-1]) + 1:
return
for nxt_num in range(int(root_balanced_num[-1]) + 1, 10):
find_root_balanced_nums(root_balanced_num + [str(nxt_num)] * nxt_num, numLen)
def permute(permutation, root_balanced_num):
if len(permutation) == len(root_balanced_num):
balanced_nums.append(''.join(permutation))
return
lastpick = None
for i in range(len(root_balanced_num)):
if root_balanced_num[i] and root_balanced_num[i] != lastpick:
backup = root_balanced_num[i]
root_balanced_num[i] = None
permute(permutation + [backup], root_balanced_num)
root_balanced_num[i] = backup
lastpick = root_balanced_num[i]
for num in range(1, len(n_str) + 1):
find_root_balanced_nums([str(num)] * num, len(n_str))
for num in range(1, len(n_str) + 2):
find_root_balanced_nums([str(num)] * num, len(n_str) + 1)
for root in root_balanced_nums:
permute([], root)
balanced_nums = list(map(lambda x: int(x), balanced_nums))
balanced_nums.sort()
for num in balanced_nums:
if int(num) > n:
return int(num)