当前位置: 首页 > news >正文

二分边界详细总结

一、查找精确值

从一个有序数组中找到一个符合要求的精确值(如猜数游戏)。如查找值为Key的元素下标,不存在返回-1。

//这里是left<=right。
//考虑这种情况:如果最后剩下A[i]和A[i+1](这也是最容易导致导致死循环的情况)首先mid = i,
//如果A[mid] < key,那么left = mid+1 = i +1,如果是小于号,则A[i + 1]不会被检查,导致错误
int left = 1,right = n;
while(left <= right)
{//这里left和right代表的是数组下标,所有没有必要改写成mid = left + (right - left)/2;//因为当代表数组下标的时候,在数值越界之前,内存可能就已经越界了//如果left和right代表的是一个整数,就有必要使用后面一种写法防止整数越界int mid = (left + right) / 2;if(A[mid] == key)return mid;else if(A[mid] > key)//这里因为mid不可能是答案了,所以搜索范围都需要将mid排除right = mid - 1;elseleft = mid + 1;
}
return -1;

二、查找大于等于/大于key的第一个元素

这种通常题目描述为满足某种情况的最小的元素。

int left = 1,right = n;
while(left < right)
{//这里不需要加1。我们考虑如下的情况,最后只剩下A[i],A[i + 1]。//首先mid = i,如果A[mid] > key,那么right = left = i,跳出循环,如果A[mid] < key,left = right = i + 1跳出循环,所有不会死循环。int mid = (left + right) / 2;if(A[mid] > key)//如果要求大于等于可以加上等于,也可以是check(A[mid])right = mid;//因为找的是大于key的第一个元素,那么比A[mid]大的元素肯定不是第一个大于key的元素,因为A[mid]已经大于key了,所以把mid+1到后面的排除elseleft = mid + 1;//如果A[mid]小于key的话,那么A[mid]以及比A[mid]小的数都需要排除,因为他们都小于key。不可能是第一个大于等于key的元素,
}

三、查找小于等于/小于key的最后一个元素

这种通常题目描述为满足某种情况的最大的元素。如Leetcode69题,求sqrt(x)向下取整就是这种模板。

int left = 1, right = n;
while(left < right)
{//这里mid = (left + right + 1) / 2;//考虑如下一种情况,最后只剩下A[i],A[i + 1],如果不加1,那么mid = i,如果A[mid] < key,执行更新操作后,left = mid,right = mid + 1,就会是死循环。//加上1后,mid = i + 1,如果A[mid] < key,那么left = right = mid + 1,跳出循环。如果A[mid] > key,left = mid = i,跳出循环。int mid = (left + right + 1) / 2;if(A[mid] < key)left = mid;//如果A[mid]小于key,说明比A[mid]更小的数肯定不是小于key的最大的元素了,所以要排除mid之前的所有元素elseright = mid - 1;//如果A[mid]大于key,那么说明A[mid]以及比A[mid]还要大的数都不可能小于key,所以排除A[mid]及其之后的元素。
}

四、总结

最后两种情况的循环跳出条件是left<right,为什么不是小于等于呢?因为我们的区间变换思路是不断的舍去不可能是解的区间,最后只剩下一个数就是我们的解。而第一种情况就算最后只剩一个数也有可能不是解,所以需要使用小于等于。

  • 查找精确值,循环条件是小于等于;查找满足情况的最大最小值,循环条件是小于。
  • 查找满足条件的最大数,mid = (right + left + 1) / 2;查找满足条件的最小数,mid = (right + left)/2
  • mid = left + (right - left) / 2,不是适用于所有的情况。
  • 如果存在没有解的情况,比如从[1,2,3,4,5]找出大于等于6的第一个数,我们只需要将最后剩下的数单独进行一次判断就可以了。

作者:T-SHLoRk
链接:https://www.acwing.com/blog/content/307/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

二分边界详细总结

一、查找精确值 从一个有序数组中找到一个符合要求的精确值&#xff08;如猜数游戏&#xff09;。如查找值为Key的元素下标&#xff0c;不存在返回-1。 //这里是left<right。 //考虑这种情况&#xff1a;如果最后剩下A[i]和A[i1]&#xff08;这也是最容易导致导致死循环的…...

STM32---备份寄存器BKP和 FLASH学习使用

BKP库函数 学习BKP&#xff0c;首先就是知道BKP每一个函数的作用然后如何使用即可 使用备份域的作用只需要操作上面的两个函数即可&#xff0c;其余的都是它的其他功能 BKP简介 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份…...

Python-生成元组和字典

1.生成元组元组是元素按顺序组合后的产物&#xff0c;元组对象的类型是tuple型含有两个元素的元组成为数据对元组可以包含任意数量和任意类型的元素&#xff0c;其元素总数可以为0、1、2等&#xff0c;并且元素的先后顺序是由意义的。另外&#xff0c;元组中的元素类型没有必要…...

I.MX6ULL内核开发10:设备树

目录 一、设备树简介 二、设备树源码 三、获取设备树信息 1、增加设备节点 2、内核编译设备树 3、替换设备树文件 4、查看设备树节点 5、在驱动中获取节点的属性 6、编译驱动模块 7、加载模块 一、设备树简介 设备树的作用是描述一个硬件平台的硬件资源。这个“设备树…...

【大数据】记一次hadoop集群missing block问题排查和数据恢复

问题描述 集群环境总共有2个NN节点&#xff0c;3个JN节点&#xff0c;40个DN节点&#xff0c;基于hadoop-3.3.1的版本。集群采用的双副本&#xff0c;未使用ec纠删码。 问题如下&#xff1a; bin/hdfs fsck -list-corruptfileblocks / The list of corrupt files under path…...

国产音质好的蓝牙耳机有哪些?国产音质最好的耳机排行

随着时间的推移&#xff0c;真无线蓝牙耳机逐渐占据耳机市场的份额&#xff0c;成为人们日常生活中必备的数码产品之一。蓝牙耳机品牌也多得数不胜数&#xff0c;哪些国产蓝牙耳机音质好&#xff1f;下面&#xff0c;我们从音质出来&#xff0c;来给大家介绍几款国产蓝牙耳机&a…...

CTFer成长之路之XSS的魔力

XSS的魔力CTF XSS闯关 题目描述: 你能否过关斩将解决所有XSS问题最终获得flag呢&#xff1f; docker-compose.yml version: "3.2"services:xss:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-xss:latestports:- 3000:3000启动方式 docker-compose up -…...

行锁、表锁、主键外键、表之间的关联关系

Java知识点总结&#xff1a;想看的可以从这里进入 目录2.4、行锁、表锁2.5、主键、外键2.5.1、主键2.5.2、外键2.6、表的关联关系2.4、行锁、表锁 MyISAM默认采用表级锁&#xff0c;InnoDB默认采用行级锁。 表锁&#xff1a;开销小&#xff0c;加锁快&#xff0c;不会出现死锁…...

JavaScript 进阶(面试必备)--charater4

文章目录前言一、深浅拷贝:one: 浅拷贝:two:深拷贝二、异常处理:one: throw 抛异常:two: try /catch 捕获异常:three:debugger三、处理thisthis指向 :one:普通函数this指向this指向 :two: 箭头函数this指向3.2 改变this:one: call():two: apply():three: bind()四、性能优化:on…...

ARM+FPGA架构开发板PCIE2SCREEN示例分析与测试-米尔MYD-JX8MMA7

本篇测评由电子发烧友的优秀测评者“zealsoft”提供。 本次测试内容为米尔MYD-JX8MMA7开发板其ARM端的测试例程pcie2screen并介绍一下FPGA端程序的修改。 ​ 01. 测试例程pcie2screen 例程pcie2screen是配合MYD-JX8MMA7开发板所带的MYIR_PCIE_5T_CMOS 工程的测试例&#…...

51单片机入门 - SDCC / Keil_C51 会让没有调用的函数参与编译吗?

Small Device C Compiler&#xff08;SDCC&#xff09;是一款免费 C 编译器&#xff0c;适用于 8 位微控制器。 不想看测试过程的话可以直接划到最下面看结论&#xff1a;&#xff09; 关于软硬件环境的信息&#xff1a; Windows 10STC89C52RCSDCC &#xff08;构建HEX文件&…...

OpenCV只含基本图像模块编译

编译OpenCV4.5.5只含基本图像模块&#xff0c;环境为Windows10 x64CMake3.23.3VS2019。默认编译选项编译得到的OpenCV库往往大几百MB甚至上GB&#xff0c;本文配置下编译得到的库压缩后得到的zip包大小仅6.25MB&#xff0c;适合使用OpenCV基本图像功能模块的项目移植而不牵涉其…...

Java实现阴历日历表(附带星座)

准备工作 1.无敌外挂(GitHub直达源码) Nobb 直击灵魂 https://github.com/xuyishanBD/Java_create_calendar.git2.maven配置(如果没有走上面的捷径) <dependencies><dependency><groupId>net.sourceforge.javacsv</groupId><artifactId>javac…...

Python入门之最基础

Python入门之最基础 IDLE有两种模式&#xff0c;一种是交互模式&#xff0c;通俗讲就是写一个代码&#xff0c;会得到相应的反馈&#xff0c;另一种为编辑模式. 注意事项&#xff1a; 标点符号一定要用英文符号 要注意缩进 dir(builtins)可以看到python所有的内置函数&#…...

浏览器缓存策略

先走强缓存&#xff0c;再走协商缓存 强缓存 不发送请求&#xff0c;直接使用缓存的内容 状态码200 当前会话没有关闭的话就是走memory cache&#xff0c;否则就是disk cache 由响应头的 Pragma&#xff08;逐渐废弃&#xff0c;优先级最高&#xff09;&#xff0c;catch-…...

高清无码的MP4如何采集?python带你保存~

前言 大家早好、午好、晚好吖 ❤ ~ 又是我,我又来采集小姐姐啦~ 这次我们采集的网站是(看下图): 本文所有模块\环境\源码\教程皆可点击文章下方名片获取此处跳转 话不多少,我们赶快开始吧~ 第三方模块: requests >>> pip install requests 如果安装python第三方模块…...

python+pytest接口自动化(1)-接口测试基础

接口定义一般我们所说的接口即API&#xff0c;那什么又是API呢&#xff0c;百度给的定义如下&#xff1a;API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或…...

go单元测试

接着上一篇中的go module创建项目calc为例&#xff0c;在simplemath包中&#xff0c;是使用在命令行中使用交互式的方式进行测试&#xff0c;现在可以为这几个函数实现单元测试&#xff0c; go test&#xff0c;这个测试工具来自于 Go 官方的 gc 工具链。 运行 go test 命令将执…...

Mybatis之一级缓存二级缓存

介绍 缓存&#xff0c;就是将经常访问的数据&#xff0c;放到内存中&#xff0c;减少对数据库的访问&#xff0c;提高查询速度。Mybatis中也有缓存的概念&#xff0c;分为一级缓存和二级缓存。 一级缓存 一级缓存是Mybatis中SqlSession对象的缓存。当我们执行查询以后&#x…...

人脸考勤机项目

文章内容如下&#xff1a; 1&#xff09;项目简介 2&#xff09;开发环境和使用的技术知识 3&#xff09;功能实现 4&#xff09;项目源码 一。项目简介 此项目是基于HOG和Dlib开发的一套实时无感考勤系统。首先是待考勤人员的个人信息录入。然后在过道或者入口处装置人脸…...

BM3D算法深度解析:为什么它至今仍是图像去噪的黄金标准?

BM3D算法深度解析&#xff1a;为什么它至今仍是图像去噪的黄金标准&#xff1f; 在数字图像处理领域&#xff0c;去噪技术一直是研究的热点与难点。从早期的均值滤波到小波变换&#xff0c;再到如今的深度学习&#xff0c;各种方法层出不穷。然而&#xff0c;在这片技术迭代的浪…...

2026秋招必备!大模型面试八股文精华(小白程序员必收藏)

本文整理了备战2026秋招时所需的大模型面试核心问题&#xff0c;涵盖LLM/VLM理论、RAG/Agent开发、RLHF对齐技术及模型评估等全链路知识。内容基于多次真实面试经历&#xff0c;建议读者先独立思考再对照答案&#xff0c;达到知其然更知其所以然的学习效果。预祝求职顺利&#…...

如何永久保存微信聊天记录?WeChatMsg免费工具终极指南

如何永久保存微信聊天记录&#xff1f;WeChatMsg免费工具终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...

(论文速读)HyperFusion-DEIM:遥感影像中多路径关注与尺度感知融合的精确物体检测

论文题目&#xff1a;遥感影像中多路径关注与尺度感知融合的精确物体检测&#xff08;Multi path attention and scale aware fusion for accurate object detection in remote sensing imagery&#xff09;期刊&#xff1a;Scientific Reports摘要&#xff1a;在遥感图像中追求…...

Cursor规则太多跑得慢?手把手教你优化.cursor配置,给VSCode插件‘减负’提速

Cursor性能优化实战&#xff1a;让智能编码助手重获流畅体验 当你的指尖在键盘上飞舞时&#xff0c;最令人沮丧的莫过于等待工具响应。作为深度集成AI能力的现代编码环境&#xff0c;Cursor在提供智能补全和代码建议的同时&#xff0c;也可能因为规则膨胀而逐渐变得迟缓。我曾见…...

从F1 90到62 F1 90:用Wireshark和CANoe‘解剖’一次完整的UDS 0x22数据读取会话

从F190到62F190&#xff1a;用Wireshark和CANoe解剖UDS 0x22数据读取会话 当你第一次在Wireshark中看到22服务请求和62响应报文时&#xff0c;那些十六进制字节可能就像天书一样难以理解。但正是这些看似杂乱的数据流&#xff0c;承载着现代汽车电子系统最核心的诊断信息交换。…...

九、《算力架构新范式:华为CloudMatrix384超节点如何重塑AI推理经济模型》——从2300 Tokens/s看系统级创新的降本增效逻辑

1. 从2300 Tokens/s看算力架构的经济学革命 当AI推理的Token消耗量在18个月内激增300倍时&#xff0c;企业突然发现&#xff1a;传统算力架构的成本曲线正在失控。我最近测试某开源大模型时&#xff0c;单次推理成本高达传统方案的4倍——直到接触华为CloudMatrix384超节点&…...

从STM32开发手册中快速定位信息:文脉定序系统的嵌入式应用联想

从STM32开发手册中快速定位信息&#xff1a;文脉定序系统的嵌入式应用联想 作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我深知那种在动辄上千页的芯片手册里“大海捞针”的痛苦。比如&#xff0c;当你需要配置一个特定的定时器中断&#xff0c;或者想确认某个GPIO引…...

MixText+BERT还能这么玩?手把手复现FPMT论文中的‘概率伪混合’黑科技

解密FPMT论文中的概率伪混合&#xff1a;BERT隐藏层的动态插值艺术 在自然语言处理领域&#xff0c;数据增强一直是提升模型泛化能力的关键技术。传统MixText方法通过线性插值在输入层混合样本&#xff0c;但这种"一刀切"的方式忽视了不同样本对模型训练的差异化价值…...

VRCX:重新定义VRChat社交管理的智能伴侣工具

VRCX&#xff1a;重新定义VRChat社交管理的智能伴侣工具 【免费下载链接】VRCX Friendship management tool for VRChat 项目地址: https://gitcode.com/GitHub_Trending/vr/VRCX 在虚拟社交平台VRChat的生态中&#xff0c;社交关系管理常常成为用户体验的痛点。传统方式…...