【发布时间】:2022-01-09 14:59:51
【问题描述】:
最近我在玩二进制搜索算法。我更喜欢以 while lo < hi开头的经典模板。
今天遇到一个问题,让我更加困惑。 leetcode问题是给定一个整数数组ribbons,其中ribbons[i]表示第i个ribbon的长度,一个整数k。您可以将任何条带切割成任意数量的正整数长度段,或者根本不进行切割。目标是获得所有相同正整数长度的 k 个色带。由于切割,您可以扔掉多余的色带。返回您可以获得的 k 个色带的最大可能正整数长度,如果无法获得相同长度的 k 个色带,则返回 0。示例输入和输出是:
Input: ribbons = [7,5,9], k = 4
Output: 4
此代码可以返回所需的结果,并且使用较高的中值:
class Solution(object):
def maxLength(self, ribbons, k):
s = sum(ribbons)
if s//k == 0:
return 0
lo, hi = 1, s//k
def bs(cut):
return sum([r//cut for r in ribbons]) >= k
while lo < hi:
mid = (lo+hi+1)//2
if bs(mid):
lo = mid
else:
hi = mid-1
return lo
这段代码也可以给出正确的答案,但使用较低的中值:
class Solution(object):
def maxLength(self, ribbons, k):
s = sum(ribbons)
if s < k: return 0
def bs(cut):
return sum([r // cut for r in ribbons]) >= k
lo, hi = 1, s//k
while lo <= hi:
mid = (lo+hi) // 2
if bs(mid):
lo = mid + 1
else:
hi = mid - 1
return hi
我的问题是,如何决定何时使用更高或更低的中频?在什么情况下应该返回lo 或hi?这真的让我很困惑。任何帮助表示赞赏。
【问题讨论】:
标签: algorithm search binary-search