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

article/2025/6/9 15:07:30

文章目录

  • 一、问题引入:寻找区间的边界
  • 二、二分的核心:二段性
  • 三、左边界的查找逻辑(找第一个 ≥ 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://www.hkcw.cn/article/qWXdHwDQfu.shtml

相关文章

系统思考:短期利益与长期系统影响

一个决策难题&#xff1a;一家公司接到了一个大订单&#xff0c;客户提出了10%的降价要求&#xff0c;而企业的产能还无法满足客户的需求。你会选择增加产能&#xff0c;接受这个订单&#xff0c;还是拒绝&#xff1f;从系统思考的角度来看&#xff0c;这个决策不仅仅是一个简单…

【数据结构 -- B树】

目录 一、前言二、B树示例定义查找数据插入数据删除数据 一、前言 前面我们已经学习了二叉搜索树和AVL树&#xff0c;它们的查找、插入、删除数据效率都很高&#xff0c;我们首先需要了解它们是怎么操作数据的 首先将所有数据一次性调到内存中&#xff0c;再在内存中进行处理…

新手小白使用VMware创建虚拟机练习Linux

新手小白想要练习linux&#xff0c;找不到合适的地方&#xff0c;可以先创建一个虚拟机&#xff0c;在自己创建的虚拟机里面进行练习&#xff0c;接下来我给大家接受一下创建虚拟机的步骤。 VMware选择创建新的虚拟机 选择自定义 硬件兼容性选择第一个&#xff0c;不同的版本&a…

C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析

前引&#xff1a;在C标准模板库&#xff08;STL&#xff09;中&#xff0c;vector作为动态数组的实现&#xff0c;既是算法题解的基石&#xff0c;也是性能优化的关键战场。其连续内存布局、动态扩容机制和丰富的成员函数&#xff0c;使其在面试高频题&#xff08;如LeetCode、…

【macbook】触控板手势

在 MacBook 上&#xff0c;你可以使用「触控板手势」或快捷键来实现在多个窗口/应用间切换&#xff0c;以下是几种方式&#xff1a; ✅ 1. 三指或四指左右滑动&#xff1a;切换“全屏应用”或“桌面”空间 **操作方式&#xff1a;**三指或四指在触控板上左右滑动。**适用场景&…

帝可得 - 策略管理

一. 需求说明 策略管理主要涉及到二个功能模块&#xff0c;业务流程如下&#xff1a; 新增策略: 允许管理员定义新的策略&#xff0c;包括策略的具体内容和参数&#xff08;如折扣率&#xff09; 策略分配: 将策略分配给一个或多个售货机。 graph TDA[登录系统] A --> B…

立志成为一名优秀测试开发工程师(第十一天)—Postman动态参数/变量、文件上传、断言策略、批量执行及CSV/JSON数据驱动测试

目录 一、Postman接口关联与正则表达式应用 1.正则表达式解析 2.提取鉴权码。 二、Postman内置动态参数以及自定义动态参数 1.常见内置动态参数&#xff1a; 2.自定义动态参数&#xff1a; 3.“编辑”接口练习 三、图片上传 1.文件的上传 2.上传后内容的验证 四、po…

学习路之PHP--easyswoole使用视图和模板

学习路之PHP--easyswoole使用视图和模板 一、安装依赖插件二、 实现渲染引擎三、注册渲染引擎四、测试调用写的模板五、优化六、最后补充 一、安装依赖插件 composer require easyswoole/template:1.1.* composer require topthink/think-template相关版本&#xff1a; "…

【C++高并发内存池篇】性能卷王养成记:C++ 定长内存池,让内存分配快到飞起!

&#x1f4dd;本篇摘要 在本篇将介绍C定长内存池的概念及实现问题&#xff0c;引入内存池技术&#xff0c;通过实现一个简单的定长内存池部分&#xff0c;体会奥妙所在&#xff0c;进而为之后实现整体的内存池做铺垫&#xff01; &#x1f3e0;欢迎拜访&#x1f3e0;&#xff…

前端验证下跨域问题(npm验证)

文章目录 一、背景二、效果展示三、代码展示3.1&#xff09;index.html3.2&#xff09;package.json3.3&#xff09; service.js3.4&#xff09;service2.js 四、使用说明4.1&#xff09;安装依赖4.2&#xff09;启动服务器4.3&#xff09;访问前端页面 五、跨域解决方案说明六…

nginx+Tomcat负载均衡群集

目录 一. LVS&#xff0c;HAProxy&#xff0c;Nginx的区别 1. 核心区别 2. 负载均衡算法对比 2. 1 LVS 负载均衡算法 2.2 HAProxy 负载均衡算法 2.3 Nginx 负载均衡算法 2.4 总结 二. 案例分析 1. 案例概述 (1) Tomcat 简介 (2)应用场景 2. 案例环境 3. 案例实施 …

WSL安装及使用 (适用于 Linux 的 Windows 子系统)

WSL简介 WSL&#xff1a;适用于 Linux 的 Windows 子系统&#xff0c;有1和2两个版本&#xff0c;1是windows重新实现了linux接口&#xff0c;2是原生linux内核。目前 WSL2 为默认模式&#xff0c;兼容性和性能更好。 wsl中文官网 安装 确保以下功能开启&#xff1a; 控制面…

JavaSec | SpringAOP 链学习分析

目录: 链子分析 反向分析 正向分析 poc 构造 总结 链子分析 反向分析 依赖于 Spring-AOP 和 aspectjweaver 两个包&#xff0c;在我们 springboot 中的 spring-boot-starter-aop 自带包含这俩类&#xff0c;所以也可以说是 spring boot 的原生反序化链了&#xff0c;调用…

PV操作的C++代码示例讲解

文章目录 一、PV操作基本概念&#xff08;一&#xff09;信号量&#xff08;二&#xff09;P操作&#xff08;三&#xff09;V操作 二、PV操作的意义三、C中实现PV操作的方法&#xff08;一&#xff09;使用信号量实现PV操作代码解释&#xff1a; &#xff08;二&#xff09;使…

医疗内窥镜影像工作站技术方案(续)——EFISH-SCB-RK3588国产化替代技术深化解析

一、异构计算架构的医疗场景适配 ‌多核任务调度优化‌ ‌A76/A55协同计算‌&#xff1a;4Cortex-A762.4GHz负责AI推理&#xff08;如息肉识别算法&#xff09;&#xff0c;4Cortex-A551.8GHz处理DICOM影像传输协议&#xff0c;多任务负载效率比赛扬N系列提升80%‌NPU加速矩阵…

HCIP-Datacom Core Technology V1.0_3 OSPF基础

动态路由协议简介 静态路由相比较动态路由有什么优点呢。 静态路由协议&#xff0c;当网络发生故障或者网络拓扑发生变更&#xff0c;它需要管理员手工配置去干预静态路由配置&#xff0c;但是动态路由协议&#xff0c;它能够及时自己感应网络拓扑变化&#xff0c;不路由选择…

敏捷转型:破局之道

在数字化浪潮与市场不确定性加剧的背景下&#xff0c;传统组织向敏捷组织转型已成为企业生存与发展的核心命题。这种转型并非简单的工具迭代或流程优化&#xff0c;而是涉及治理结构、文化基因与人才机制的深度重构。理解两种组织形态的本质差异&#xff0c;明确转型的适用场景…

WordPress 6.5版本带来的新功能

WordPress 6.5正式上线了&#xff01;WordPress团队再一次为我们带来了许多新的改进。在全球开发者的共同努力下&#xff0c;WordPress推出了许多新的功能&#xff0c;本文将对其进行详细总结。 Hostease的虚拟主机现已支持一键安装最新版本的WordPress。对于想要体验WordPres…

软硬解锁通用Switch大气层1.9.0系统+20.0.1固件升级 图文教程 附大气层大气层固件升级整合包下载

软硬解锁通用Switch大气层1.9.0系统20.0.1固件升级 图文教程 附大气层大气层固件升级整合包下载 大气层&#xff08;Atmosphere&#xff09;是为任天堂 Switch 主机开发的免费开源自定义固件&#xff08;CFW&#xff09;&#xff0c;由开发者 SciresM 领导的团队维护。它允许用…

Redisson学习专栏(五):源码阅读及Redisson的Netty通信层设计

文章目录 前言一、分布式锁核心实现&#xff1a;RedissonLock源码深度解析1.1 加锁机制&#xff1a;原子性与重入性实现1.2 看门狗机制&#xff1a;锁自动续期设计1.3 解锁机制&#xff1a;安全释放与通知1.4 锁竞争处理&#xff1a;等待队列与公平性1.5 容错机制&#xff1a;异…