📅  最后修改于: 2023-12-03 14:55:20.099000             🧑  作者: Mango
给定一个长度为n的数组nums和一个整数S,你需要找到一个最小的正整数K,使得将数组中的每个元素都除以K后得到一个新的数组,新数组中所有元素的总和不超过S。
首先,我们需要找到nums中最小的元素min,这个最小值除以K的值k是答案的一个下界。我们可以通过二分查找法找到满足要求的最小的K。
对于一个K值,我们可以遍历一遍数组,对于每个元素,计算它除以K后的值,然后累加起来得到新数组的元素总和sum。如果sum小于等于S,那么这个K值是可行的,我们继续测试更小的K值,否则这个K值不可行,我们需要试图增大K值。
二分查找用了O(log_2(N))的时间,每轮遍历数组用了O(N)的时间,因此总时间复杂度为O(N*log_2(N))。
def find_K(nums, S):
def check(k):
sum = 0
for num in nums:
sum += (num // k)
return sum <= S
low, high = 1, min(nums)
while low <= high:
mid = (low + high) // 2
if check(mid):
high = mid - 1
else:
low = mid + 1
return low