二分查找,终止条件为“left < right”,步长更新为“left = mid +1,right = mid”

2023-12-02

我正在读leetcode中的二分查找模板二:

它用于搜索需要的元素或条件访问当前索引及其直接右邻居的索引在数组中。

def binarySearch(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    if len(nums) == 0:
        return -1

    left, right = 0, len(nums)
    while left < right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid

    # Post-processing:
    # End Condition: left == right
    if left != len(nums) and nums[left] == target:
        return left
    return -1

我觉得额外的条件and nums[left] == target是不必要的。

改变时:

if left != len(nums) and nums[left] == target:

to just:

if left != len(nums):

...它工作完美:

def binarySearch(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: int
    """
    if len(nums) == 0:
        return -1

    left, right = 0, len(nums)
    while left < right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid

    # Post-processing:
    # End Condition: left == right
    if left != len(nums):
        return left
    return -1

Tests:

In [4]: nums = list(range(100))             

In [5]: binarySearch(nums, 55)              
Out[5]: 55

In [6]: binarySearch(nums, 101)             
Out[6]: -1

In [7]: binarySearch(nums, 38)              
Out[7]: 38

什么原因nums[left] == target应该添加?

Leetcode对模板的总结(如果打不开链接可以参考):

关键属性:

  • 实现二分查找的高级方法。
  • 搜索条件需要访问元素的直接右邻居
  • 利用元素的右邻居来判断是否满足条件并决定向左还是向右
  • 保证 [原文如此] 每一步的搜索空间大小至少为 2
  • 需要后处理。当剩下 1 个元素时,循环/递归结束。需要评估剩余元素是否满足 健康)状况。

区分语法:

  • 初始条件:left = 0, right = length
  • 终止:left == right
  • 向左搜索:right = mid
  • 搜索权:left = mid+1

与二分搜索的规范版本相反,其中循环一旦终止lo > hi满足,在这种情况下循环终止lo == hi。但由于元素nums[lo](这也是nums[hi]) 也必须进行检查,额外的检查是在循环之后添加的。

保证循环仅在且仅当lo == hi,因为向左移动包括mid未来搜索中的元素(else: right = mid)在规范版本中,mid在这两种情况下,元素都被排除在未来的搜索之外

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二分查找,终止条件为“left < right”,步长更新为“left = mid +1,right = mid” 的相关文章

  • Python:记录垃圾收集器

    我有一个 python 应用程序 有一些性能问题 我想将垃圾收集器的事件 特别是何时调用 添加到我的日志中 是否可以 thanks http docs python org library gc html gc set debug http
  • Python 遍历目录树的方法是什么?

    我觉得分配文件和文件夹并执行 item 部分有点黑客 有什么建议么 我正在使用Python 3 2 from os import from os path import def dir contents path contents list
  • 如何在 ReportLab 段落中插入回车符?

    有没有办法在 ReportLab 的段落中插入回车符 我试图将 n 连接到我的段落字符串 但这不起作用 Title Paragraph Title n Page myStyle 我想要这样做 因为我将名称放入单元格中 并且想要控制单元格中的
  • 如何找到列表S的所有分区为k个子集(可以为空)?

    我有一个唯一元素列表 比方说 1 2 我想将其拆分为 k 2 个子列表 现在我想要所有可能的子列表 1 2 1 2 2 1 1 2 我想分成 1 1 2 我怎样才能用 Python 3 做到这一点 更新 我的目标是获取 N 个唯一数字列表的
  • Python 正则表达式部分匹配或“hitEnd”

    我正在编写一个扫描器 因此我将任意字符串与正则表达式规则列表进行匹配 如果我可以模拟 Java hitEnd 功能 不仅知道正则表达式何时不匹配 还知道何时匹配 这将非常有用 can t匹配 当正则表达式匹配器在决定拒绝输入之前到达输入末尾
  • 在Python中创建一个新表

    我正在尝试从数控机床中提取数据 事件每毫秒发生一次 我需要过滤掉一些用管道 分隔的变量分隔符 PuTTy exe 程序生成的日志文件 我尝试阅读熊猫 但列不在同一位置 df pd read table data log sep 日志文件的一
  • 如何使用循环将十进制转换为二进制?

    我想编写一个程序 将十进制数 0 到 9 转换为二进制数 我可以编写如何使用重复除法将十进制数转换为二进制数的代码 但是 我在创建一个以二进制格式打印十进制数字 0 到 9 的循环时遇到了麻烦 这是我的代码 number 0 remaind
  • 错误:无法访问文件“$libdir/plpython2”:没有这样的文件或目录

    我正在运行 postgresql 9 4 PostgreSQL 9 4 4 on x86 64 unknown linux gnu compiled by gcc GCC 4 1 2 20070626 Red Hat 4 1 2 14 64
  • 在Python中删除带有重音符号的字符串中的所有非字母字符

    我正在尝试使用 Python 3 7 从包含重音符号的字符串中删除所有非字母字符 空格除外 我尝试了以下方法 import re text 29 1981 4 2008 clean text re sub W d text print cl
  • 如何使用 PySpark 有效地将这么多 csv 文件(大约 130,000 个)合并到一个大型数据集中?

    我之前发布了这个问题并得到了一些使用 PySpark 的建议 如何有效地将这一大数据集合并到一个大数据框中 https stackoverflow com questions 60259271 how can i merge this la
  • Python 视频框架

    我正在寻找一个 Python 框架 它将使我能够播放视频并在该视频上绘图 用于标记目的 我尝试过 Pyglet 但这似乎效果不是特别好 在现有视频上绘图时 会出现闪烁 即使使用双缓冲和所有这些好东西 而且似乎没有办法在每帧回调期间获取视频中
  • 一起使用 Flask 和 Tornado?

    我是以下的忠实粉丝Flask 部分是因为它很简单 部分是因为它有很多扩展 http flask pocoo org extensions 然而 Flask 是为了在 WSGI 环境中使用而设计的 而 WSGI 不是非阻塞的 所以 我相信 它
  • 如何在 Python 中从 HTML 页面中提取 URL [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须用Python 编写一个网络爬
  • 如何强制 Y 轴仅使用整数

    我正在使用 matplotlib pyplot 模块绘制直方图 我想知道如何强制 y 轴标签仅显示整数 例如 0 1 2 3 等 而不显示小数 例如 0 0 5 1 1 5 2 等 我正在查看指导说明并怀疑答案就在附近matplotlib
  • 使用Beam IO ReadFromPubSub模块时,可以在Python中提取带有属性的消息吗?尚不清楚是否支持

    尝试将具有存储在 PubSub 中的属性的消息拉取到 Beam 管道中 我想知道是否添加了对 Python 的支持 这就是我无法阅读它们的原因 我看到它存在于Java中 pipeline options PipelineOptions pi
  • Jupyter Notebook:没有名为 pandas 的模块

    我搜索了其他问题 但没有找到任何有帮助的内容 大多数只是建议您使用 conda 或 pip 安装 pandas 在我的 jupyter 笔记本中 我试图导入 pandas import pandas as pd 但我收到以下错误 Modul
  • 如何设置 matplotlib 表中列的背景颜色

    我在一个目录中有多个 txt 文件 例如 d memdump 0 txt 1 txt 10 txt 示例文本文件如下 Applications Memory Usage kB Uptime 7857410 Realtime 7857410
  • SQLAlchemy:避免声明式样式类定义中的重复

    我正在使用 SQLAlchemy 并且我的对象模型中的许多类具有相同的两个属性 id 和 整数和主键 以及名称 字符串 我试图避免在每个类中声明它们 如下所示 class C1 declarative base id Column Inte
  • 如何使用Featuretools按列值从单个数据框中的多个列创建特征?

    我正在尝试根据之前的结果来预测足球比赛的结果 我在 Windows 上运行 Python 3 6 并使用 Featuretools 0 4 1 假设我有以下代表结果历史记录的数据框 原始数据框 https i stack imgur com
  • 获取调用者文件的绝对路径

    假设我在不同的目录中有两个文件 1 py 比如说 在C FIRST FOLDER 1 py and 2 py 比如说 在C SECOND FOLDER 2 py 文件1 py进口2 py using sys path insert 0 pa

随机推荐

  • 未提供 Django Rest Framework 身份验证凭据

    我在用着django rest auth with django all auth关于 DRF 和 Angularjs 对于任何有关身份验证的请求 我收到以下错误 detail Authentication credentials were
  • 如何加快sheet中数据的搜索速度

    我有超过 1000000 条记录如何在工作表中加快搜索速度 我一般搜索20s如何提高 表格包括20列和10000条记录 var ss SpreadsheetApp openByUrl urldb var ws ss getSheetByNa
  • 带有微调器的可编辑文本视图 android

    我想在 android 中创建一个控件 用户可以通过键盘输入或通过下拉列表 微调器 输入 实际上 我在微调器的数组中硬编码的值并不详尽 因此用户也应该可以选择通过虚拟键盘输入 那么用户可以通过键盘输入或从列表中选择吗 我怎样才能在andro
  • 按命名空间转换对象

    我需要像这样转换 平面对象 输入数据 prop1 value 1 prop2 subprop1 value 2 1 prop2 subprop2 value 2 2 像这样的沉浸对象 输出数据 prop1 value 1 prop2 sub
  • Linux 上一个进程如何拦截另一个进程的 stdout 和 stderr?

    我有一些应该停止运行的脚本 但它们却永远存在 有什么方法可以让我以可读的方式弄清楚他们正在向 STDOUT 和 STDERR 写入什么内容 例如 我尝试这样做 tail f proc pid fd 1 但这并没有真正起作用 无论如何 这是一
  • 通过应用程序通过 HttpPost 登录网站

    你好 Stackoverflowers 我编写了一个相对简单的应用程序 由登录文本字段 密码文本字段和登录按钮组成 我的目标是 当用户输入登录信息并触摸登录按钮时 应用程序将使用户登录到我指定的网站 并以不同的意图或 WebView 打开它
  • 删除 SublimeText 中但匹配的所有文本

    我正在尝试删除 sublime 中除电子邮件之外的所有字符串 所以我可以寻找这样的电子邮件 a zA Z0 9 a zA Z0 9 a zA Z0 9 但我该如何删除其他所有内容呢 Thanks 您可以执行以下操作 Use your reg
  • 如何制作一个flex(词法扫描器)来读取UTF-8字符输入?

    看起来flex不支持UTF 8输入 每当扫描器遇到非 ASCII 字符时 它就会停止扫描 就像它是 EOF 一样 有没有办法强制 Flex 吃掉我的 UTF 8 字符 我不希望它实际匹配 UTF 8 字符 只需在使用 时吃掉它们即可图案 有
  • 浮动:右反转跨度的顺序

    我有 HTML div span class label a href index 1 Bookmix Offline a span span class button a href settings Settings a span spa
  • 仅使用 print 语句进行调试

    最近我用 Python 编写了很多代码 我一直在处理以前从未使用过的数据 使用以前从未见过的公式并处理巨大的文件 所有这些让我写了很多打印语句来验证一切是否正常并找出故障点 但是 一般来说 输出这么多信息并不是一个好的做法 如何仅在我想要调
  • 有人可以解释一下 Shell Shock Bash 代码吗? [复制]

    这个问题在这里已经有答案了 我在理解以下代码时遇到问题 该代码是 Shell Shock 的 漏洞证明 代码 有人可以向我解释一下吗 特别是这部分 env x echo vulnerable bash c echo this is a te
  • 如何让视图永远旋转?

    有没有办法让视图以指定的速度永远旋转 我需要它来作为指标之类的东西 我知道有一个奇怪的 Lxxxxx00ff 常量 记不太清了 代表 永远 您可以使用HUGE VAL对于浮动值 如果我没记错的话 动画的repeatCount属性是一个浮动值
  • 如何判断 ASP 中的页面卸载是否为回发

    这似乎是一个常见问题 但搜索没有返回任何内容 我在页面卸载之前执行以下代码 问题是 如果卸载是回发 我不想向用户发出警告 但我无法弄清楚如何区分回发和用户导航到例如另一页 This is executed before the page a
  • 即使成功创建对象后,django modelformset_factory 仍保留先前提交的数据

    我在我的观点之一中使用 django modelformset factory 我正在使用 javascript 将新表单添加到模板中的表单集 一切工作正常 但我的问题是 当我尝试使用 modelformset factory 创建一个新对
  • iPhone - 捕获设备按钮按下

    我知道您无法从应用程序内控制设备音量 但我希望设备音量能够影响应用程序中的 UIScrollBar 来控制音量 我知道这是可能的 因为 Last fm 应用程序可以做到这一点 我想实现此行为 我在互联网上能找到的信息很少 这里有人可以帮助我
  • iOS 版 Appium 的代码覆盖率

    这个问题似乎已经以多种不同的方式被问到了 所以如果我在这里遗漏了一些明显的东西 请提前道歉 但这对我来说仍然不清楚 我正在使用 Appium 作为功能测试套件的一部分来运行 UIAutomation 测试 如何从该套件生成代码覆盖率指标 理
  • Java 和 HID 通信

    我正在寻找为简单的无线 HID 接口设备编写一个 Linux Windows Mac Java HID 控制器 我对 USB4Java LibUsb 库进行了修改 但没有成功 我已经转向 JavaHIDAPI 的方向 不幸的是 对我来说 除
  • 如何在 SQL (Excel) 中传递参数进行查询

    我将 Excel 链接 到 Sql 它工作得很好 我编写了一些 SQL 脚本 它工作得很好 我想做的就是将参数传递给查询 就像每次刷新一样 我希望能够将参数 过滤条件 传递给 Sql 查询 在 连接属性 中 参数按钮被禁用 所以我无法进行参
  • Spring cron 与普通 cron 比较?

    我试图让 cron 作业在遗留的 Java Spring Hibernate 项目中工作 所以我决定使用 spring 调度程序 我希望 myTask doStuff 在每月第一个星期日的 12 00 运行 在我的 application
  • 二分查找,终止条件为“left < right”,步长更新为“left = mid +1,right = mid”

    我正在读leetcode中的二分查找模板二 它用于搜索需要的元素或条件访问当前索引及其直接右邻居的索引在数组中 def binarySearch nums target type nums List int type target int