📅  最后修改于: 2023-12-03 14:58:05.462000             🧑  作者: Mango
在这个问题中,给定 N 段长度各异的木材,需要将这些木材切割成至少 K 块并使得其长度最大。我们可以通过解决一个二分查找问题得出答案。
def wood_cut(woods, k):
"""
:type woods: List[int]
:type k: int
:rtype: int
"""
left, right = 1, max(woods)
while left <= right:
mid = left + (right - left) // 2
count = sum([(wood // mid) for wood in woods])
if count >= k:
left = mid + 1
else:
right = mid - 1
return left - 1 if sum([(wood // (left - 1)) for wood in woods]) >= k else 0
由于将 N 段木材全部遍历平均要花费 O(N) 的时间,而二分查找算法最坏情况下可以在 O(log(right - left)) 的时间内得到答案,因此时间复杂度为 O(N * log(right - left))。
同时,该算法使用了 O(1) 的空间,因此空间复杂度为 O(1)。