【问题标题】:how to decide to use lower mid or higher mid when using binary search?使用二分搜索时如何决定使用较低的中值或较高的中值?
【发布时间】: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

我的问题是,如何决定何时使用更高或更低的中频?在什么情况下应该返回lohi?这真的让我很困惑。任何帮助表示赞赏。

【问题讨论】:

    标签: algorithm search binary-search


    【解决方案1】:

    你的一个实现被破坏了:)

    最终,选择向下或向上舍入 mid 取决于您的检查是太低还是太高。

    在你的情况下,bs(mid) 是一个太高的检查,所以你的 if 应该是这样的:

    if bs(mid):
        # not too high (correct answer is >=)
        lo = mid
    else
        # too high (correct answer is <)
        hi = mid-1
    

    因为您的检查太高,可能的下一个边界是midmid-1。如果您的支票太低,那么可能是mid+1mid

    为了保证范围在每次迭代中变小(避免无限循环)并且始终保证lo &lt;= hi,您需要lo &lt;= mid-1 &lt; mid &lt;= hi。鉴于lo &lt; hi,这是由mid = lo + (hi-lo+1)//2 保证的——向上取整。

    如果您的支票太低,那么您需要lo &lt;= mid &lt; mid+1 &lt;= hi。使用lo &lt; hi,由mid = lo + (hi-lo)//2 保证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2020-07-10
      • 2013-06-05
      • 2016-10-10
      • 1970-01-01
      相关资源
      最近更新 更多