http://www.lintcode.com/zh-cn/problem/wood-cut/
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k
。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。
注意事项
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0
即可。
Lintcode上面的一道题目,很有意思,光看题可能想象不出是用二分来做。但是实际小段的长度可以使用二分来确定。left为0,right为原始木头的最长长度(注意不是最小长度)。但是这道题二分的复杂度也不是O(logn)而是和木头的数目也成正比关系(每次对于划分的长度,需要计算一遍所有的木头得到可以锯出的小段数目)。具体代码如下:
class Solution: """ @param L: Given n pieces of wood with length L[i] @param k: An integer return: The maximum length of the small pieces. """ def woodCut(self, L, k): if not L: return 0 l = 0 r = max(L) while l+1 < r: mid = l + (r-l)/2 if sum([i/mid for i in L]) >= k: l = mid else: r = mid if sum([i/r for i in L]) < k: return l else: return r
时间: 2024-10-11 09:26:19