📅  最后修改于: 2023-12-03 14:55:21.703000             🧑  作者: Mango
给定一个整数数组,我们需要找到一个最小的可能整数 K,使得对于数组中的每个元素,其 ceil 除以 K 的结果不大于给定的 M。
我们可以使用二分查找来查找最小的可能整数 K。首先,我们定义二分查找的上限是数组中最大元素的值,下限为1。然后,在每次二分查找的过程中,我们计算出当前的猜测整数 mid,然后遍历数组,对于每个元素求出其 ceil 除以 mid 的结果,如果结果大于 M,则说明当前的 mid 太小,需要增大 mid,否则 mid 可以更小。最后,当上限达到下限时,就找到了最小的可能整数 K。
import math
def find_k(nums, m):
left, right = 1, max(nums)
while left < right:
mid = (left + right) // 2
count = sum(math.ceil(num / mid) for num in nums)
if count > m * len(nums):
left = mid + 1
else:
right = mid
return left
时间复杂度:$O(n \log m)$,其中 n 是数组中的元素个数,m 是 ceil 除以 mid 的结果不大于给定的 M,二分查找的次数是 $O(\log m)$,遍历数组的时间是 $O(n)$。
空间复杂度:$O(1)$。