二分查找模板:基础二分与进阶二分

news/2025/10/6 21:03:47/文章来源:https://www.cnblogs.com/dedseclossr/p/19127923

二分查找模板:基础二分与进阶二分

本人在学习到 @灵茶山艾府 的二分查找专题时,收获颇多,故借助大模型记录一些学习心得。
根据目标不同,二分查找可以分为 基础二分(情况1:查找任意一个目标值)和 进阶二分(查找第一个目标值/最后一个目标值)。二分查找的目标是在一个区间查找目标值,故可将区间分为 均闭区间 [left, right]、均开区间 (left, right)、左闭右开 [left, right)、左开右闭 (left, right] 四种,常用的是 均闭区间。几种类型的区间仅在左右边界的收缩以及循环条件的编码方面有所差异。下面以均闭区间为例总结模板。

均闭区间在进阶二分问题的最终形态为 left > right ,此时left指向最后一个目标值。


1. 基础二分(查找任意一个目标值)

目标:找到数组中是否存在 target,返回任意一个索引。

模板

int binarySearch(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right) {             // 区间 [left, right]int mid = (left + right) / 2;if (nums[mid] == target) return mid;  // 找到直接返回else if (nums[mid] < target) left = mid + 1;  // 缩小到右区间else right = mid - 1;                       // 缩小到左区间}return -1; // 未找到
}
  • 条件分支包含 =,找到直接返回。

2. 进阶二分(情况1):查找第一个目标值(左边界)

目标:找到 target 在数组中第一次出现的位置。

模板

@灵茶山艾府 的Leetcode T34题解

// lower_bound 返回最小的满足 nums[i] >= target 的下标 i
// 如果数组为空,或者所有数都 < target,则返回 nums.size()
// 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]
int lower_bound(vector<int>& nums, int target) {int left = 0, right = (int) nums.size() - 1; // 闭区间 [left, right]while (left <= right) { // 区间不为空// 循环不变量:// nums[left-1] < target// nums[right+1] >= targetint mid = left + (right - left) / 2;  // 这种写法的目的是防止 (left + right) / 2 的分子溢出if (nums[mid] >= target) {right = mid - 1; // 范围缩小到 [left, mid-1]} else {left = mid + 1; // 范围缩小到 [mid+1, right]}}// 循环结束后 left = right+1// 此时 nums[left-1] < target 而 nums[left] = nums[right+1] >= target// 所以 left 就是第一个 >= target 的元素下标return left;
}
  • = 并入 >= 分支,使搜索继续收缩到最左边。

3. 进阶二分(情况2):查找最后一个目标值(右边界)

目标:找到 target 在数组中最后一次出现的位置。

模板

// upper_bound 返回最大的满足 nums[i] <= target 的下标 i
// 如果数组为空,或者所有数都 > target,则返回 -1
// 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]
int upper_bound(vector<int>& nums, int target) {int left = 0, right = (int) nums.size() - 1; // 闭区间 [left, right]while (left <= right) { // 区间不为空// 循环不变量:// nums[left-1] <= target// nums[right+1] > targetint mid = left + (right - left) / 2;   // 这种写法的目的是防止 (left + right) / 2 的分子溢出if (nums[mid] <= target) {left = mid + 1;   // 范围缩小到 [mid+1, right]} else {right = mid - 1;  // 范围缩小到 [left, mid-1]}}// 循环结束后 right = left-1// 此时 nums[right] <= target 且 nums[left] = nums[right+1] > target// 所以 right 就是最后一个 <= target 的元素下标return right;
}
  • = 并入 <= 分支,使搜索继续收缩到最右边。

4. 总结

  • 基础二分(任意值):= 时立即返回。
  • 进阶二分(左边界)=> 合并,收缩右边界。
  • 进阶二分(右边界)=< 合并,收缩左边界。
  • 区间选择:不同区间定义(闭/开)影响循环条件和更新方式,模板需统一风格。建议使用均开/均闭区间的模板。

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

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

相关文章

【设计模式-4.5】行为型——迭代器模式 - 教程

【设计模式-4.5】行为型——迭代器模式 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

阿里云centos7做网站免费psd模板网站

win7输入密码界面背景怎么更改?win7开机的登录密码界面想要换张图不晓得如何改&#xff0c;下面是小编介绍win7登录界面换背景的技巧&#xff0c;有需要的小伙伴一起来下文看看吧&#xff0c;希望可以帮助到大家! win7输入密码界面背景怎么更改 按windowss键R键打开运行&…

运动鞋建设网站前的市场分析企业免费oa管理系统

系统架构 Flink运行时架构Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager 是一个 Flink 集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。每个应用都应该被唯一的 JobManager 所控制执行。 JobManger 又包含…

浅谈并查集

带权并查集 Luogu P2024 经典例题食物链。 题意:\(n\) 个动物,可能是三个物种之一,给出若干描述,形如两个动物是同类或是吃与被吃的关系,确定出矛盾的描述。 考虑建图,有边相连代表确定一个确定另一个关系,这是…

SP6950 CTOI10D3 - A HUGE TOWER 题解

按照 $ h $ 降序依次放每个积木,此时如果有 \(2\) 块积木,那么一定满足条件。因为 \(h_{\text{now}} - h_{\text{pre}} \leq 0 \leq D\)。 继续往下想,再加一块,也要满足 $ h_{\text{next}} - h_{\text{now}} \le…

如何免费搭建网站wordpress安装完怎么恢复数据

引用 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

Kubernetes 定时备份etcd数据

Kubernetes 定时备份etcd数据Posted on 2025-10-06 20:54 清欢也野 阅读(0) 评论(0) 收藏 举报个人笔记、与各位的环境不同、自行修改 编写dockfile镜像 1、首先我利用的是k8s自带的基础容器镜像 [root@qinghuany…

蒲县网站建设长沙中小企业做网站

1.简介 1.1单例模式 C单例模式被广泛应用于需要全局唯一实例的场景。以下是一些常见的使用场景&#xff1a; 日志记录器 在大多数应用程序中&#xff0c;需要一个全局的日志记录器来记录系统运行时的事件和错误。使用单例模式可以确保只有一个日志记录器实例&#xff0c;并能…

16_AiAgentMCP简单教程

ai mcp AI Agent与MCP简单教程:从入门到实践 总起:开启AI Agent与MCP之旅 什么是AI Agent? AI Agent(人工智能代理)是能够自主感知环境、做出决策并执行行动的智能实体。与传统的被动式AI不同,AI Agent具有主动性…

17_AiAgentMCP实现技术选型

ai mcp AI Agent与MCP实现技术选型:全面指南与最佳实践 总起:技术选型的重要性与挑战 为什么MCP技术选型至关重要? 在AI Agent快速发展的时代,Model Context Protocol(MCP)作为连接AI模型与外部资源的关键桥梁,…

谷歌chrome浏览器优化网络搜索引擎

def 将一个列表中的几个字典改成二维列表(original_list,headersToRemove_list):# 初始化一个列表用于存储遇到的键&#xff0c;保持顺序ordered_keys []# 遍历data中的每个字典&#xff0c;添加其键到ordered_keys&#xff0c;如果该键还未被添加for d in original_list:for …

JVM_XMS 和 java_opts哪种写法对?如何在JVM中设置JVM_XMS和java_opts?

JVM_XMS 和 java_opts哪种写法对? JVM_XMS与JAVA_OPTS是两种不同的JVM参数设置方式,具体写法需根据使用场景选择: JVM_XMS(初始堆大小)‌写法‌::ml-search-more[-Xms]{text="-Xms"}(如-Xms512m) ‌…

百度网盘做存储网站上海百度搜索优化

我一直在探索PPT中平滑切换的应用。这篇文章感觉算是探索到头了。之前的文章中&#xff0c;曾经提到过平滑切换可以让3D模型动起来。但是在实际应用中&#xff0c;能够供PPT使用的3D素材数量有限&#xff0c;难以准确契合我们的需求。后来我发现&#xff0c;只需要1张普通图片&…

鸿蒙编译ffmpeg库 - 详解

鸿蒙编译ffmpeg库 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

网站描述怎么设置网站上线后的工作

解决方法就是: from django.urls import reverse 最近从django1.9迁移到django2.0中出现一个意外的报错&#xff1a; 这个报错的原因在stack overflow上有很直接的解释&#xff0c;但是百度上并没有直接的答案。 简单来说&#xff0c;原因就是&#xff1a;django2.0 把原来…

宁乡县住房和城乡建设局网站扒网站样式

来源&#xff1a;《科学哲学的历史导论》、思庐哲学&#xff08;siluphilosophy&#xff09;作者&#xff1a;约翰洛西对正统学说的诸多批评有一种累积的效果。许多科学哲学家渐渐认为&#xff0c;用形式逻辑范畴来重建科学时会失去一些至关重要的东西。在他们看来&#xff0c;…

知道却做不到

这种“知道步骤但写不出来”的情况非常常见,核心原因是对“类的参数设计”和“类之间的协作关系”还没有形成清晰的逻辑链。其实参数设计有明确的规律——每个类的参数都应该服务于它的“核心职责”。我们用“从职责倒…

题解:loj154 集合划分计数

题意:给出一个大小为 \(n\) 的全集 \(A = \{1,2,\cdots n\}\),再给出 \(m\) 个集 \(S_1,S_2\cdots S_m\),要求从这些集里选出至多 \(k\) 个,满足 \(S\) 间没有交集且并集是全集,\(k\le n\le 21,m\le 262144\)。 做…

网址大全下载app鄂州网站seo

目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击&#xff08;PTH攻击&#xff09; 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录&#xff0c;可以使用这个工具 ​ 第一种连接方式&#xff1a;smbclient -L 目…

怎样做网贷网站陕西省建设银行网站

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字&#xff0c;它们除了长得像之外&#xff0c;其他的&#xff08;作用和含义&#xff09;完全不同。 它们三个的区别就好像&#xff1a;雷、雷锋、雷峰塔之间的区别。&#xff08;是三个完全不同的东西&#…