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

文章目录

  • 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;它转…

LeetCode 2885.重命名列

DataFrame students ------------------- | Column Name | Type | ------------------- | id | int | | first | object | | last | object | | age | int | ------------------- 编写一个解决方案&#xff0c;按以下方式重命名列&#xff1a; id 重命名为 student_id first 重…

Tomcat数据源笔记

Tomcat数据源笔记 连接池的概念 连接池是一种由容器提供的机制&#xff0c;用于管理数据库连接对象的集合。连接池的主要作用是在应用程序需要与数据库进行交互时&#xff0c;提供可复用的连接对象&#xff0c;从而减少每次建立数据库连接的开销。 连接池的工作原理 连接池的…

软件工程---原型评价

在原型被构建后&#xff0c;由开发人员组织实施测试&#xff0c;测试是原型评价的一个重要组成部分。 但是测试用例一般不能发现所有的缺陷&#xff0c;所以说测试也不是万能的。 Dam和Siang提出了几个获取原型反馈的最佳实践技巧&#xff1a; 1. 在要求原型反馈时提供框架素…

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

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

【LeetCode】739. 每日温度(中等)——代码随想录算法训练营Day58

题目链接&#xff1a;739. 每日温度 题目描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在…

ElementUI自定义主题

文档&#xff1a; https://element.eleme.io/#/zh-CN/component/custom-theme 方式一&#xff1a;在项目中改变 SCSS 变量 element-variables.scss /* 改变主题色变量 */ $--color-primary: teal;/* 改变 icon 字体路径变量&#xff0c;必需 */ $--font-path: ~element-ui/l…

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;如果可以实…

Linux异步通知实验:驱动中异步通知的处理

一. 简介 前面几篇文章学习了 Linux异步通知机制&#xff0c;以及驱动或应用程序关于异步通知机制是如何处理的。 驱动对异步通知的处理方法如下&#xff1a; Linux应用程序对异步通知的处理-CSDN博客 本文开始通过实验&#xff0c;学习异步通知机制方法。本文具体来学习驱…

中间件面试题之MQ

MQ相关面试题 Kafka面试题 (1)rockermq和kafka 的区别在哪里? 使用场景有什么不一样? 不同点: 数据可靠性 不同: RocketMQ:支持异步实时刷盘、同步刷盘、同步复制、异步复制;kafka:使用异步刷盘方式,异步复制/同步复制。性能对比:kafka单机写入TPS比较高单机支持…

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

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