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

二分查找的边界艺术:LeetCode 34 题深度解析

文章目录

  • 一、问题引入:寻找区间的边界
  • 二、二分的核心:二段性
  • 三、左边界的查找逻辑(找第一个 ≥ target 的位置)
  • 四、右边界的查找逻辑(找最后一个 ≤ target 的位置)
  • 五、代码实现
  • 六、二分边界模板总结
  • 结语

在这里插入图片描述

一、问题引入:寻找区间的边界

本题要求在非递减数组中找到目标值的起始位置和结束位置,若不存在则返回 [-1, -1]。由于数组有序,常规二分只能定位任意目标位置,但本题需精确边界,这就需要利用 二分查找的二段性 设计条件。

二、二分的核心:二段性

二段性 指数组可被某个条件划分为两部分:一部分满足条件,另一部分不满足。例如:

  • 左边界:数组分为「小于 target 的区间」和「大于等于 target 的区间」,分界点即左边界。
  • 右边界:数组分为「小于等于 target 的区间」和「大于 target 的区间」,分界点即右边界。

利用二段性,我们可通过调整二分条件,让指针逐步逼近边界。

三、左边界的查找逻辑(找第一个 ≥ target 的位置)

以示例 nums = [5,7,7,8,8,10], target=8 为例,左边界是索引 3。

算法步骤

  1. 初始化left=0, right=n-1(n 为数组长度)。
  2. 循环条件while (left < right)(当 left==right 时结束,此时即为结果)。
  3. 计算中点mid = left + (right - left) / 2(取左中位数,避免死循环)。
  4. 条件判断
    • nums[mid] < target:mid 在「小于 target 区间」,左边界必在右侧,故 left = mid + 1
    • 否则(nums[mid] ≥ target):mid 可能在目标区间内,缩小右边界,故 right = mid
  5. 结果验证:循环结束后,检查 nums[left] 是否等于 target。若不等,说明目标不存在。

四、右边界的查找逻辑(找最后一个 ≤ target 的位置)

仍以示例为例,右边界是索引 4。

算法步骤

  1. 初始化:复用左边界的 left(优化性能),重置 right = n-1
  2. 循环条件while (left < right)
  3. 计算中点mid = left + (right - left + 1) / 2(取右中位数,避免死循环)。
  4. 条件判断
    • nums[mid] > target:mid 在「大于 target 区间」,右边界必在左侧,故 right = mid - 1
    • 否则(nums[mid] ≤ target):mid 可能在目标区间内,扩大左边界,故 left = mid
  5. 结果直接使用:循环结束后,right 即为右边界(因左边界已验证存在,无需重复判断)。

五、代码实现

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if (nums.empty()) return {-1, -1}; // 空数组直接返回// 1. 查找左边界int left = 0, right = nums.size() - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] < target){left = mid + 1; // 左半区不满足,右移左指针} else {right = mid;    // 右半区可能满足,左移右指针}}int start = left; // 暂存左边界if (nums[start] != target) return {-1, -1}; // 目标不存在// 2. 查找右边界right = nums.size() - 1; // 重置右指针(左指针可复用start)while (left < right) {int mid = left + (right - left + 1) / 2; // 右中位数if (nums[mid] > target) {right = mid - 1; // 右半区不满足,左移右指针} else {left = mid;      // 左半区可能满足,右移左指针}}int end = right;return {start, end};}
};

六、二分边界模板总结

场景循环条件中点计算条件判断逻辑
左边界left < rightmid = left + (right-left)/2nums[mid] < target → left=mid+1;否则 right=mid
右边界left < rightmid = left + (right-left+1)/2nums[mid] > target → right=mid-1;否则 left=mid

记忆技巧

  • 左边界用 左中位数,右边界用 右中位数,避免死循环。
  • 条件判断中,让需要 “跳出” 的区间移动指针(如左边界中,<target 的区间需跳出,故 left=mid+1)。

结语

二分查找的边界问题核心是 二段性的挖掘指针收缩的细节处理。记住:边界的本质是二段性,模板的差异是中位数和条件的选择,理解这一点,二分问题将迎刃而解。


文章转载自:

http://df84LSGu.mwbqk.cn
http://4hXVlGyx.mwbqk.cn
http://AwZrw8Kc.mwbqk.cn
http://V6wb7Y6X.mwbqk.cn
http://Heewu5j6.mwbqk.cn
http://jgQHPrzl.mwbqk.cn
http://hpxlZtoZ.mwbqk.cn
http://erg1OjUa.mwbqk.cn
http://0DzLGFuz.mwbqk.cn
http://fOFZiNp7.mwbqk.cn
http://BvLXuVqZ.mwbqk.cn
http://tsMp2Ztn.mwbqk.cn
http://VUX1mwfJ.mwbqk.cn
http://kFxDtzgm.mwbqk.cn
http://mCCfh5O6.mwbqk.cn
http://vZJDaAMf.mwbqk.cn
http://ZtPLNl2p.mwbqk.cn
http://I1GGxNTl.mwbqk.cn
http://ZhxNlN3J.mwbqk.cn
http://Fo65ghxM.mwbqk.cn
http://qPRKfbj4.mwbqk.cn
http://tLqaOOD2.mwbqk.cn
http://4h35On9n.mwbqk.cn
http://OB6saJbc.mwbqk.cn
http://sKYb0eFG.mwbqk.cn
http://ZGt0Qf8v.mwbqk.cn
http://8L1xFu0u.mwbqk.cn
http://eLeh2MfM.mwbqk.cn
http://C0OGlHJo.mwbqk.cn
http://RBVAkclw.mwbqk.cn
http://www.dtcms.com/a/229084.html

相关文章:

  • Dify-5:Web 前端架构
  • 登录的写法,routerHook具体配置,流程
  • 算法/机理模型演示平台搭建(二)——算法接口部署(FastApi)
  • 帝可得 - 策略管理
  • uniapp开发使用vue3组合式api,实现从vue模块中自动导入
  • 简单transformer运用
  • Delphi 设置文件 永久只读
  • 数据安全中心是什么?如何做好数据安全管理?
  • Foundation Models for Generalist Geospatial Artificial Intelligence论文阅读
  • windows修改跃点数调整网络优先级
  • DiskGenius专业版v6.0.1.1645:分区管理、数据恢复、备份还原,一应俱全!
  • Win11系统不推送24H2/西数SSD无法安装24H2 - 解决方案
  • MyBatis 执行 SQL 报错:String 无法转换为 Long 的排查与解决实录
  • Vue3中Axios的使用-附完整代码
  • 从测试角度看待CI/CD,敏捷开发
  • vue入门环境搭建及demo运行
  • cursor对话
  • Web前端为什么要打包?Webpack 和 Vite 如何助力现代开发?
  • 大数据 ETL 工具 Sqoop 深度解析与实战指南
  • 工厂模式与多态结合
  • enum的用法
  • 【JavaWeb】SpringBoot原理
  • RAG入门 - Reader(2)
  • [Java 基础]打印金字塔
  • Shell脚本编程入门与实战指南
  • AI网校平台开发探索:集成直播、考试题库、白板互动的教育系统源码
  • 降本增效的新引擎:GEO如何提升企业营销ROI
  • 当 “欧洲版 Cursor” 遇上安全危机
  • 【数据结构知识分享】顺序表详解
  • 【分层图 最短路 迪氏堆优化最短路】B4165 [BCSP-X 2024 12 月初中组] 贸易|普及+