📅  最后修改于: 2023-12-03 14:54:20.658000             🧑  作者: Mango
给定一个正整数 N,找到一个最小的阶乘数,使得其数字之和等于 N。如果不存在这样的阶乘数,则返回 -1。
例如:
从小到大遍历阶乘数,找到第一个阶乘数使得其数字和等于 N。因为阶乘数的数字和是单调递增的,所以找到的第一个符合要求的阶乘数一定是最小的。
另外,由于 1! = 1,所以 N > 1 时至少需要两个阶乘数相加,因此只需要遍历到以 2 开始的阶乘。
def find_min_factorial_sum(n: int) -> int:
def get_factorial(num):
res = 1
for i in range(2, num+1):
res *= i
return res
for i in range(2, n+1):
digits_sum = sum(map(int, str(i)))
factorial_sum = get_factorial(digits_sum)
if factorial_sum == n:
return i
elif factorial_sum > n:
break
return -1
本题的时间复杂度为 O(N^2),空间复杂度为 O(1)。虽然和解法简单,但输入较大时运行时间较长。如果需要优化,可以在计算数字的阶乘时使用缓存来减少计算次数,或者使用二分查找来找到符合要求的阶乘数。