二分查找的梳理——边界初始值、循环条件、边界更新

文章目录

  • 1 来源
  • 2 思考
    • 2.1 区间的选择——由区间决定写法
    • 2.2 重点:右边界初始值、循环条件、边界更新
    • 2.3 两种写法详解
      • 2.3.1 左闭右闭的写法
      • 2.3.2 左闭右开的写法

1 来源

手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找
在这里插入图片描述

2 思考

2.1 区间的选择——由区间决定写法

这里的区间指的是在什么区间上进行二分。

  • 左闭右闭
  • 左闭右开

2.2 重点:右边界初始值、循环条件、边界更新

  • 右边界初始值:是 num.size()-1 还是 num.size()
  • 循环条件:是 left<right 还是 left<=right
  • 边界更新:是 right=middle 还是 right=middle-1

2.3 两种写法详解

2.3.1 左闭右闭的写法

  • 右边界初始值:因为选择在左闭右闭的区间上进行二分,所以应该设置
left=0;
right=num.size()-1
  • 循环条件:因为是左闭右闭区间上进行二分,当 left 与 right 指向同一个元素的时候,此时区间还是符合左闭右闭的区间特点,是合法区间,所以这种情况下循环继续,有
while(left<=right)
  • 边界更新:
    循环体内主要就是三步进行二分,先判断 target 是不是比中值小?还是比中值大?还是等于中值?
    比中值小就需要更新右边界,此时因为 target 是比中值小的,则 target 确定不在要进行二分的区间,并且此时选择左闭右闭的区间进行二分,那么为了使二分的区间不包括中值 middle,应有
right = middle-1;

同理,比中值大需要更新左边界,为了使确定不是二分区间内的 middle 不包含在下一次要进行二分的区间,故

left = middle+1;

比中值大直接输出即可。


完整代码:

left=0;
right=num.size()-1;
while(left<=right){middle=(left+(right-left))>>1;//避免越界的写法,相当于(left+right)/2if(num[middle]>target) right=middle-1;else if(num[middle]<target) left=middle+1;else return middle;
}
return -1;

2.3.2 左闭右开的写法

  • 右边界初始值:因为选择在左闭右开的区间上进行二分,所以应该设置
left=0;
right=num.size()
  • 循环条件:因为是左闭右开区间上进行二分,当 left 与 right 指向同一个元素的时候,此时区间并不符合左闭右开的区间特点,为非法区间,所以这种情况下循环退出,有
while(left<right)
  • 边界更新:
    循环体内主要就是三步进行二分,先判断 target 是不是比中值小?还是比中值大?还是等于中值?
    比中值小就需要更新右边界,此时因为 target 是比中值小的,则 target 确定不在要进行二分的区间,但是由于选择左闭右开的区间进行二分,当 middle 刚好为右边界时,二分区间刚好就不包括 middle,所以
right = middle;

同理,比中值大需要更新左边界,为了使确定不是二分区间内的 middle 不包含在下一次要进行二分的区间,故

left = middle+1;

比中值大直接输出即可。


完整代码:

left=0;
right=num.size();
while(left<=right){middle=(left+(right-left))>>1;//避免越界的写法,相当于(left+right)/2if(num[middle]>target) right=middle;else if(num[middle]<target) left=middle+1;else return middle;
}
return -1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记-华为IPD转型2020:1,IPD的重要意义

华为产品开发转型&#xff1a;IPD计划 大多数公司发现&#xff0c;当公司大幅增长时&#xff0c;在较小规模上有效的管理实践不再有效。产品开发过程也是如此。随着华为的发展&#xff0c;该公司遇到了产品故障率更高、开发周期更长和研发成本增加等问题。然后&#xff0c;它转…

小米汽车SU7定档发布,雷军携智能科技赴三年之约

大家好&#xff01; 我是老洪。 刚刚浏览到一则关于小米汽车的新闻&#xff0c;内容颇为引人关注。 小米SU7&#xff0c;这款备受期待的新能源汽车&#xff0c;已经正式定档在3月28日发布。 雷军&#xff0c;小米的掌舵人&#xff0c;已经明确表示&#xff0c;他们对即将到来的…

k8s基本使用(namespace,pod增删查)-持续更新中

目录 1. 查看Namespace 2. 创建Namespace 2.1 使用纯命令行创建 2.2 编写yaml文件创建 3. 删除Namespace 3.1 使用纯命令行删除 3.2 使用yaml文件删除 二、Pod 1. 查看pod 1.1 查看默认空间的pod 1.2 查看指定空间的pod 1.3 查看全部pod 1.4 查看pod更多信息 1…

leetcode-hot100-矩阵

73. 矩阵置零 给定一个 _m_ x _n_ 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 **输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 两次遍历&#xff0c;第一…

springboot265基于Spring Boot的库存管理系统

基于Spring Boot库存管理系统 Inventory Meanagement System based on Spring Boot 摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮…

【读论文】【精读】3D Gaussian Splatting for Real-Time Radiance Field Rendering

文章目录 1. What&#xff1a;2. Why&#xff1a;3. How&#xff1a;3.1 Real-time rendering3.2 Adaptive Control of Gaussians3.3 Differentiable 3D Gaussian splatting 4. Self-thoughts 1. What&#xff1a; What kind of thing is this article going to do (from the a…

图片和PDF 加水印去水印

图片和PDF 加水印去水印 前要1. 图片加水印1.1 方法11.2 方法2 2. 去水印3. pdf加水印4. pdf 去水印 前要 网上查了很多资料, 汇总了几个不错的代码, 顺便做个笔记 1. 图片加水印 1.1 方法1 简单方便, 后也好处理 # -*- coding:utf-8 -*- import os from PIL import Imag…

24-Java策略模式 ( Strategy Pattern )

Java策略模式 摘要实现范例 策略模式的重心不是如何实现算法&#xff0c;而是如何组织、调用这些算法&#xff0c;从而让程序结构更加灵活&#xff0c;具有更好的维护性和扩展性。 策略模式属于行为型模式 摘要 1. 意图 针对一组算法&#xff0c;将每一个算法封装到具有共…

微服务day01 -- SpringCloud01 -- (Eureka , Ribbon , Nacos)

介绍微服务 1.认识微服务(p1-p5) 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#…

vscode使用remote-ssh免密连接服务器

你还在使用XShell、Hyper、FinalShell等等SSH客户端软件吗&#xff0c;作为前端的我们&#xff0c;一直在用的功能强大的开发工具vscode&#xff0c;早已实现SSH连接功能&#xff08;借助官方提供的插件&#xff09;。而且更加好用&#xff0c;可以直接打开服务器上的文件&…

蓝桥杯练习系统(算法训练)ALGO-975 P0802字符串表达式

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个字符串表达式求解函数int expression(char* s); 输入一个字符串表达式&#xff0c;返回它的结果。表达式长度不会超过100。表…

Qt 使用RAW INPUT获取HID触摸屏,笔设备,鼠标的原始数据,最低受支持的客户端:Windows XP [仅限桌面应用]

在开发绘图应用程序时&#xff0c;经常会需要读取笔设备的数据&#xff0c;通过对笔数据的解析&#xff0c;来判断笔的坐标&#xff0c;粗细。如果仅仅只是读取鼠标的坐标&#xff0c;就需要人为在应用程序端去修改笔的粗细&#xff0c;并且使用体验不好&#xff0c;如果可以实…

解析Perl爬虫代码:使用WWW__Mechanize__PhantomJS库爬取stackoverflow.com的详细步骤

在这篇文章中&#xff0c;我们将探讨如何使用Perl语言和WWW::Mechanize::PhantomJS库来爬取网站数据。我们的目标是爬取stackoverflow.com的内容&#xff0c;同时使用爬虫代理来和多线程技术以提高爬取效率&#xff0c;并将数据存储到本地。 Perl爬虫代码解析 首先&#xff0…

【Docker】 ubuntu18.04编译时内存不足需要使用临时交换分区解决“c++: internal compiler error“错误

【Docker】 ubuntu18.04编译时内存不足需要使用临时交换分区解决"c: internal compiler error"错误 问题描述 安装独立功能包时编译不成功&#xff0c;出现 “c: internal compiler error: Killed(program cciplus)” 错误。 解决方案 出现这个问题的原因大概率是…

模拟电子技术实验(二)

单选题 1. 本实验的实验目的中&#xff0c;输出电阻测量是第几个目的&#xff1f; A. 1个。 B. 2个。 C. 3个。 D. 4个。 答案&#xff1a;C 评语&#xff1a;10分 单选题 2.本实验电路有一个元件参数有问题&#xff0c;需要修改&#xff1f; A. …

[数据集][目标检测]变电站缺陷检测数据集VOC+YOLO格式8307张17类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8307 标注数量(xml文件个数)&#xff1a;8307 标注数量(txt文件个数)&#xff1a;8307 标注…

如何理解Redis中的缓存雪崩,缓存穿透,缓存击穿?

目录 一、缓存雪崩 1.1 解决缓存雪崩问题 二、缓存穿透 2.1 解决缓存穿透 三、缓存击穿 3.1 解决缓存击穿 3.2 如何保证数据一致性问题&#xff1f; 一、缓存雪崩 缓存雪崩是指短时间内&#xff0c;有大量缓存同时过期&#xff0c;导致大量的请求直接查询数据库&#xf…

三维卡通数字人解决方案,支持unity和Maya

企业对于品牌形象和宣传手段的创新需求日益迫切&#xff0c;美摄科技凭借其在三维卡通数字人领域的深厚积累&#xff0c;推出了面向企业的三维卡通数字人解决方案&#xff0c;帮助企业轻松打造独具特色的虚拟形象&#xff0c;提升品牌影响力和市场竞争力。 美摄科技的三维卡通…

Postman请求API接口测试步骤和说明

Postman请求API接口测试步骤 本文测试的接口是国内数智客&#xff08;www.shuzike.com&#xff09;的API接口手机三要素验证&#xff0c;验证个人的姓名&#xff0c;身份证号码&#xff0c;手机号码是否一致。 1、设置接口的Headers参数。 Content-Type&#xff1a;applicati…

Kafka消费者重平衡

「&#xff08;重平衡&#xff09;Rebalance本质上是一种协议&#xff0c;规定了一个Consumer Group下的所有Consumer如何达成一致&#xff0c;来分配订阅Topic的每个分区」。 比如某个Group下有20个Consumer实例&#xff0c;它订阅了一个具有100个分区的Topic。 正常情况下&…