0793. 阶乘函数后 K 个零
大约 2 分钟
---
0793. 阶乘函数后 K 个零
- 标签:数学、二分查找
- 难度:困难
题目链接
题目大意
描述:
是 末尾是 的数量。回想一下 ,且 。
- 例如,,因为 的末尾没有 ;而 ,因为 末端有 个 。
给定 k。
要求:
找出返回能满足 的非负整数 的数量。
说明:
- 。
示例:
- 示例 1:
输入:k = 0
输出:5
解释:0!, 1!, 2!, 3!, 和 4! 均符合 k = 0 的条件。- 示例 2:
输入:k = 5
输出:0
解释:没有匹配到这样的 x!,符合 k = 5 的条件。解题思路
思路 1:二分查找
末尾 的个数取决于因子中 的个数(因为 的个数总是比 多)。设 表示 末尾 的个数,则:
性质:
- 是单调非递减的。
- 对于某个 ,要么不存在 使得 (返回 ),要么存在连续的 个 使得 (返回 )。
原因:
- 当 不是 的倍数时,。
- 当 是 的倍数但不是 的倍数时,。
- 因此, 每次增加至少 ,且连续 个数中至少有一个是 的倍数。
思路 1:代码
class Solution:
def preimageSizeFZF(self, k: int) -> int:
def count_zeros(x):
"""计算 x! 末尾 0 的个数"""
count = 0
while x > 0:
x //= 5
count += x
return count
def binary_search(k):
"""二分查找最小的 x 使得 f(x) >= k"""
left, right = 0, 5 * (k + 1)
while left < right:
mid = (left + right) // 2
if count_zeros(mid) < k:
left = mid + 1
else:
right = mid
return left
# 找到最小的 x 使得 f(x) = k
x = binary_search(k)
# 如果 f(x) = k,则存在 5 个这样的 x
if count_zeros(x) == k:
return 5
else:
return 0思路 1:复杂度分析
- 时间复杂度:,二分查找的时间复杂度为 ,每次计算 的时间复杂度为 。
- 空间复杂度:。