二分查找算法模板
这里推荐一个很方便记忆和使用的二分查找模板希望对大家有用。二分查找Binary Search是一种高效的有序数组查找算法通过每次将搜索范围缩小一半来快速定位目标值。其时间复杂度为 O(log n)适用于静态数据或频繁查询的场景。比如一个序列1 2 4 5 5 5 5 6 6 7 9 10现在我们查找 5 这个数字。该序列中有 4 个 5分别查找第一个 5 和最后一个 5 的位置。一、查找右边序列的左端点我们现在先来查找第一个5的位置。二分查找利用的是二段性所以我们把上面的序列根据要找的值来进行分段。二分查找最后会找到分段的地方所以我们分段时要将需要找的第一个5的位置定在分段的交界处。// 假设上面的序列是放在 vector 中的对象名称为 vintleft0,rightv.size()-1;while(leftright){intmidle(ri-le)/2;if(v[mid]5)leftmid1;elserightmid;}循环条件while(left right)必须是 left right不能有等于因为循环到最后就会两个相等相等的那个就是结果所以为了不形成死循环循环条件不能有等号。left 和 right 的移动left mid 1;right mid;一般我们会想到leftmid1;rightmid-1;但这里并没有查验 mid 指向的位置的值是否为目标值所以我们并不能直接否认 mid 的位置将序列范围压缩到 [mid 1, right] 或 [left, mid -1]。事实上在该情况下left 可以更新为 mid 1 right 却不能更新为 mid -1我们要求的是右序列的左端点当 mid 指向的值位于左边序列时需要移动 left 到 mid 位置或 mid 1 位置考虑到查找的一定不会位于 mid 的位置比如上面的例子查找的是 5而左边的序列都是小于 5 的当 mid 位于左边的序列时一定不会有 5所以跳出这个序列即可所以 left mid 1 即可。但当 mid 指向的值位于右边序列时需要移动 right 到 mid 或 mid-1 的位置此时只能选择 mid 的位置因为查找可能位于 mid 的位置因为右边都是 5 的mid 可能正好位于我们所查找的位置一旦 right mid -1 那就会错过 mid 这个位置的正确下标了。中间下标的计算mid le (ri - le)/2;原本的形式为intmid(leftright)/2;但这样计算有一个缺点如果 left 和 right 的和超过类型的范围那计算就会出错。所以采用上面的写法。计算中间值有两种写法intmid(leftright)/2;// 对应的不超范围的写法为mid left (right-left)/2;intmid(leftright1)/2;// 对应的不超范围的写法为mid left (right-left1)/2;这两种写法的区别是当序列个数为偶数时第一个mid会指向数组最中间两个的左边而第二个会指向右边的那个。求左端点只能使用第一种写法否则会造成死循环。二、查找左边序列的右端点现在来查找最后一个5的位置。依据将要查找的位置定于分段处来进行分段。二分查找最后会找到分段的地方所以我们分段时要将需要找的最后一个 5 的位置定在分段的交界处。// 假设上面的序列是放在 vector 中的对象名称为 vintleft0,rightv.size()-1;while(leftright){intmidle(ri-le1)/2;if(v[mid]5)leftmid;elserightmid-1;}道理类似左端点的查找这里不多赘述。三、关于分段一个查询值时的分段1 2 4 5 6 7 8 9 10比如在上面的序列中我们想要查询 8 这个值有两种分段方式两种方式都可以区别只是求左端点还是右端点。此时延伸一下即如果有多个目标值不同的分段就会导致得到不同的下标如下图。没有查询值时的分段上面看到了序列中有所要查询的值下面看一下如果没有查询值时的情况。1 2 4 5 5 5 5 6 6 7 9 10对于上面的序列如果要查询 8 这个值肯定是查不到的但可以查到离他最近的最近的就是 7 和 9 的位置。我们分段时是按 8 来进行分段的所以如果要查到 7 的位置就是要查找左端点如果要查找 9 的位置就是要查找右端点所以根据需要来写代码即可。但要注意一点对于分段时等于的处理。如果序列中确实没有要查找的值那等于的情况分到那边都可以但如果不清楚要查找的值到底在序列中有没有那就要注意等号分到哪边了会有不同的结果。四、关于未在序列中的数的查找1 2 4 5 5 5 5 6 6 7 9 10如果这个序列要查找 0那很明显在该序列范围外每次计算的 mid 总是会落在右区间所以一定会是 right 移动而 left 不动最后会移动到 left 和 right 相等然后退出循环如下图。如果查找的是超过序列最大值的同理是 right 不动而 left 总向右移动最终 left 和 right 相等然后退出循环如下图。

相关新闻

Java动态数组_支持泛型

Java动态数组_支持泛型

上一篇文章是动态数组, 但是只能用在int, 这次修复了部分上次运行潜在的问题, 并更新为支持不同类型的内容进入数组 实现支持泛型的Java动态数组 普通数组虽然优点在于便于通过位置进行取值, 但存在一个明显的缺点, 就是长度一旦创建就无法更改. 一旦数组满了, 就只有再创建一个…

2026/7/3 22:31:23 阅读更多 →
2005-2022年地级市地方政府税收竞争数据

2005-2022年地级市地方政府税收竞争数据

数据简介 地方政府税收竞争是指地方政府间以增强本地区的经济实力、提高本地区相关福利为目的,通过税收手段进行的与其他地区争夺经济资源及税收资源的活动。 地方政府税收竞争主要集中于第二、第三产业,较少涉及零税负或低税负的第一产业。因此,本数据…

2026/5/17 9:21:53 阅读更多 →
2026年AI大模型排名全景分析:从权威榜单看行业格局

2026年AI大模型排名全景分析:从权威榜单看行业格局

2026年AI大模型排名全景分析:从权威榜单看行业格局 说实话,每隔几个月看一次大模型排名,感觉就像在看一场没有终点的马拉松。 今天这篇文章,我把全网几个权威机构的榜单数据扒了一遍,给你聊聊当前 AI 大模型的真实格局。 一、权威机构榜单概览 目前业内认可度最高的几个…

2026/5/17 5:48:33 阅读更多 →

最新新闻

TPOT自动化机器学习:基于遗传编程的可解释pipeline优化

TPOT自动化机器学习:基于遗传编程的可解释pipeline优化

1. TPOT 是什么:一个会自己写代码的机器学习助手你有没有过这种体验:花一整天调参,把 Random Forest 的n_estimators从 100 试到 1000,把max_depth从 5 拉到 20,再换 SVM、XGBoost、LightGBM 轮流上阵,最后…

2026/7/6 23:46:47 阅读更多 →
AD74412R与MK64FN1M0VDC12在工业自动化中的高精度信号链设计

AD74412R与MK64FN1M0VDC12在工业自动化中的高精度信号链设计

1. AD74412R与MK64FN1M0VDC12的黄金组合解析在工业自动化和高精度测量领域,信号链的优化直接影响整个系统的性能表现。AD74412R作为ADI公司推出的四通道软件可配置I/O解决方案,与NXP的MK64FN1M0VDC12(Kinetis K64系列)微控制器组合…

2026/7/6 23:44:44 阅读更多 →
Next.js DApp 中间件层:钱包认证、路由守卫与 RPC 故障转移

Next.js DApp 中间件层:钱包认证、路由守卫与 RPC 故障转移

Next.js DApp 中间件层:钱包认证、路由守卫与 RPC 故障转移 一、前端直接裸连链上基础设施是一种不可持续的模式 一个典型的 Next.js DApp 启动流程通常是:安装 wagmi/ethers、配个 RPC URL、写个 useConnect,然后就开始写业务。这种模式在 D…

2026/7/6 23:42:42 阅读更多 →
电子表格条件函数实战指南:从IF到XLOOKUP的三层逻辑体系

电子表格条件函数实战指南:从IF到XLOOKUP的三层逻辑体系

1. 为什么你总在重复改表格?条件函数才是电子表格真正的“大脑”我带过不少刚转行做数据分析、财务或运营的朋友,他们第一次接触条件函数时,几乎都经历过同一个崩溃时刻:花两小时手动筛选、分类、打标签,结果发现隔壁同…

2026/7/6 23:42:42 阅读更多 →
Claude 4.7 Opus接入AWS Bedrock的Agentic Coding工程实践

Claude 4.7 Opus接入AWS Bedrock的Agentic Coding工程实践

1. 项目概述:这不是一次简单的API调用,而是一场对AI工程化边界的压力测试“Claude 4.7 Opus落地 AWS Bedrock”——这个标题里藏着三重现实张力。第一重是模型代际的跃迁:Opus作为Anthropic当前公开能力最强的闭源模型,其上下文窗…

2026/7/6 23:40:40 阅读更多 →
AI战略规划系统:从顶层设计到工程落地的实战指南

AI战略规划系统:从顶层设计到工程落地的实战指南

1. 项目概述:为什么需要一个AI战略规划系统?在技术圈子里泡了十几年,我见过太多团队在拥抱AI时的“阵痛期”。大家往往一上来就扎进模型选型、数据清洗的细节里,热火朝天地搞了几个月,最后却发现系统难以维护、成本失控…

2026/7/6 23:40:40 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻