【问题标题】:How to find the highest number less than target value in a list?如何在列表中找到小于目标值的最大数字?
【发布时间】:2013-11-16 19:47:59
【问题描述】:

我正在尝试编写一个二进制搜索,它采用排序列表并找到小于目标值的最大数字:

def binary_max(list, target)
    hi=len(list)-1
    lo=0
    while lo<=hi:
        mid=(hi+lo)//2
        midval=list[mid]
        if midval > target:
            hi=mid-1
        elif midval <= target:
            lo=mid
        if hi==lo:
            break
    return(list[mid])
pass

但是,例如,当有一个长度为 2 的列表时,hi=1 并且中间值将始终停留在 lo 有没有办法避免这个问题?

谢谢

【问题讨论】:

  • 这听起来可能很傻,但是:您能否更新您的问题以包含完整的函数和调用它的代码?
  • while 循环在 Python 中是惯用的,除非它是无限循环 (while True)
  • @PauloScardine,但是如果你查看bisect.py...
  • @gnibbler:这个模块看起来像 C 翻译成 Python,但我想不出更好的算法。 :-)

标签: python binary-search


【解决方案1】:

bisect 模块提供了功能来做到这一点。使用bisect.bisect

【讨论】:

    【解决方案2】:

    当你 break 退出循环时,mid 仍然包含上一次迭代的值。

    【讨论】:

      【解决方案3】:

      这是一个简单的函数。希望它有效:

      def bin_search(list, target):
          if target not in list:
              return None
          list.sort()
          return list[list.index(target)-1]
      

      【讨论】:

      • 你可以像这样简化它list[list.index(target)-1]
      • 确实如此,我只是说如何简化答案的最后两行。
      【解决方案4】:

      你可以找到小于目标值的最大数如下:

      n = int(input())
      arr = map(int, input().split())
      arr = list(arr)
      indices = [v for i,v in enumerate(arr) if v != max(arr)]
      print(max(indices))
          
      

      这里我展示了目标值 = 列表中的最大值。您可以将最大值更改为您想要的任何目标值。

      【讨论】:

        猜你喜欢
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        • 2013-06-07
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 2012-02-10
        相关资源
        最近更新 更多