二分查找(在排序数组查找元素)(2) 📅 发布时间:2026/7/11 13:38:22 👁️ 浏览次数: https://blog.csdn.net/2601_95366422/article/details/158657963上节课链接一.题目34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣LeetCode二.思路2.1 引入在上节课中我们学习了普通二分查找其中求中点的方式有两种一种是不加1的写法mid left (right - left) / 2另一种是加1的写法mid left (right - left 1) / 2。那么这两种写法的区别是什么它们在数组长度为偶数时体现——不加1时中点会偏向左边而加1时中点会偏向右边。正是这个细微的差别衍生出了两种不同的二分查找变体寻找左边界和寻找右边界。接下来我将以左边界为例为大家详细讲解。2.2 左边界讲解一、什么是左边界问题在一个有序数组中如果存在重复元素我们可能需要找到第一个等于目标值的位置这就是左边界。普通二分查找只要找到一个目标就返回不关心它在重复元素中的位置而左边界要求在多个相同目标中返回最左边的下标。二、整体思想左边界二分查找依然利用数组的有序性二分性每次将搜索区间缩小一半。但与普通二分不同它的区间缩进规则需要保证最终收敛到第一个等于目标的位置。核心在于当中间值等于目标时不能直接返回而要继续向左搜索因为左边可能还有相同值。三、循环条件采用while (left right)作为循环条件。为什么不是left right因为当left right时区间内只剩下一个元素此时无需再二分可以直接判断这个元素是否为目标。使用可以避免在区间缩小时陷入死循环并且在循环结束后自然得到唯一候选位置。四、计算中点中点计算公式为mid left (right - left) / 2即向下取整不加1。在数组长度为偶数时中点会偏向左边。这种取法对于左边界查找至关重要它确保当left和right相邻时中点就是left从而避免陷入死循环并与后续缩进规则配合使区间稳定向左侧收缩。五、区间缩进规则在循环中比较nums[mid]与目标值target根据结果更新指针当nums[mid] target时说明目标值一定在mid的右侧且mid及其左边所有元素都小于目标因此它们都不可能是左边界。所以将左指针移动到mid 1即left mid 1舍弃左半区间。当nums[mid] target时这里包含了两种情况nums[mid] target或nums[mid] target。如果nums[mid] target目标在左边左边界肯定在mid左侧可能等于某个更小的位置。如果nums[mid] targetmid本身可能就是左边界但左边可能还有相同值因此不能排除mid需要继续向左搜索。无论哪种情况左边界都在mid及左侧区间内因此将右指针移动到mid即right mid保留mid在搜索区间中。为什么这里用right mid而不是mid - 1因为当nums[mid] target时mid有可能是左边界必须保留当nums[mid] target时目标在左边但mid本身不可能不过为了统一逻辑采用right mid可以保证区间正确收缩并且不会错过可能的左边界。六、循环结束后的处理当while (left right)结束时必有left right此时区间仅剩一个元素。我们需要判断这个元素是否等于目标如果nums[left] target则left就是左边界返回该下标。否则说明数组中不存在目标返回 -1。七、关键点总结中点取法必须向下取整不加1这是左边界查找的精髓避免死循环。循环条件用left right保证最后只剩一个元素时退出并统一判断。缩进规则当nums[mid] target时left mid 1否则right mid。这种规则确保区间始终向左侧收敛。最终判断不可省略因为循环结束时left指向的元素未必是目标。2.3 右边界讲解一、什么是右边界问题在一个有序数组中如果存在重复元素有时我们需要找到最后一个等于目标值的位置这就是右边界。与左边界对称右边界要求在多个相同目标中返回最右边的下标。二、整体思想右边界二分查找依然利用数组的有序性二分性每次将搜索区间缩小一半。其核心在于当中间值等于目标时不能直接返回而要继续向右搜索因为右边可能还有相同值。因此区间缩进规则需要保证最终收敛到最后一个等于目标的位置。三、循环条件采用while (left right)作为循环条件。为什么不是left right因为当left right时区间内只剩下一个元素此时无需再二分可以直接判断这个元素是否为目标。使用可以避免在区间缩小时陷入死循环并且在循环结束后自然得到唯一候选位置。四、计算中点中点计算公式为mid left (right - left 1) / 2即向上取整加1。在数组长度为偶数时中点会偏向右边。这种取法对于右边界查找至关重要它确保当left和right相邻时中点就是right从而避免陷入死循环并与后续缩进规则配合使区间稳定向右侧收缩。五、区间缩进规则在循环中比较nums[mid]与目标值target根据结果更新指针当nums[mid] target时说明目标值一定在mid的左侧且mid及其右边所有元素都大于目标因此它们都不可能是右边界。所以将右指针移动到mid - 1即right mid - 1舍弃右半区间。当nums[mid] target时这里包含了两种情况nums[mid] target或nums[mid] target。如果nums[mid] target目标在右边右边界肯定在mid右侧可能等于某个更大的位置。如果nums[mid] targetmid本身可能就是右边界但右边可能还有相同值因此不能排除mid需要继续向右搜索。无论哪种情况右边界都在mid及右侧区间内因此将左指针移动到mid即left mid保留mid在搜索区间中。为什么这里用left mid而不是mid 1因为当nums[mid] target时mid有可能是右边界必须保留当nums[mid] target时目标在右边但mid本身不可能不过为了统一逻辑采用left mid可以保证区间正确收缩并且不会错过可能的右边界。六、循环结束后的处理当while (left right)结束时必有left right此时区间仅剩一个元素。我们需要判断这个元素是否等于目标如果nums[left] target则left就是右边界返回该下标。否则说明数组中不存在目标返回 -1。七、关键点总结中点取法必须向上取整加1这是右边界查找的精髓避免死循环。循环条件用left right保证最后只剩一个元素时退出并统一判断。缩进规则当nums[mid] target时right mid - 1否则left mid。这种规则确保区间始终向右侧收敛。最终判断不可省略因为循环结束时left指向的元素未必是目标三.代码演示class Solution { public: vectorint searchRange(vectorint nums, int target) { vectorintv; int n nums.size(); //为空那么访问数组会越界 if(n 0) return {-1,-1}; int left1 0; int right1 n-1; //左边界 while(left1 right1) { //求中点 int mid left1 (right1 - left1)/2; if(nums[mid] target) left1 mid 1; else { right1 mid; } } if(nums[left1] target) v.push_back(left1); int left2 0; int right2 n-1; //右边界 while(left2 right2) { //求中点 int mid left2 (right2 - left2 1)/2; if(nums[mid] target) right2 mid - 1; else { left2 mid; } } if(nums[left2] target) v.push_back(left2); if(v.size() ! 2) return {-1,-1}; return v; } };
vue基于springboot高校教材管理网站_47nia 目录技术栈选择系统模块划分数据库设计接口规范关键功能实现安全措施部署方案测试计划开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术栈选择 前端采用Vue.js框架,搭配Element UI组件库实现响应式界面。后端使用… 2026/7/11 13:37:23
计算机毕业设计源码:Python基于大数据的租房价格分析平台 Django框架 Requests爬虫 可视化 房子 房源 大数据 大模型(建议收藏)✅ 博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与… 2026/3/18 16:40:09
OpenClaw实战五|企业文档AI助理:对接内部知识库+自动答疑+文档生成,员工自助查资料零等待 只要是稍微有点规模的公司,一定会被这几个知识管理顽疾逼疯: 员工天天问重复问题:报销怎么走?电脑怎么配?VPN怎么开?年假有几天?HR/IT/行政一半时间都在当“人工客服”; 文档散得到处都是:网盘、Wiki、企业微信文件、钉钉表格、个人电脑,找一份流程要翻半小时,还不一… 2026/5/17 9:30:25
AtlasOS终极指南:三步打造高性能Windows系统的完整教程 AtlasOS终极指南:三步打造高性能Windows系统的完整教程 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/GitHub_Trending/atl… 2026/7/11 13:35:01
ScreenshotFramer实战指南:与Fastlane Snapshot无缝集成的10个技巧 ScreenshotFramer实战指南:与Fastlane Snapshot无缝集成的10个技巧 【免费下载链接】ScreenshotFramer Create localized App Store screenshots 项目地址: https://gitcode.com/gh_mirrors/sc/ScreenshotFramer ScreenshotFramer是一款专为iOS开发者设计的强… 2026/7/11 13:30:58
Harness AI工程化:从代码补全到自主开发的范式转变 如果你还在用传统的代码补全工具,可能已经落后了至少一个时代。当大多数开发者还在纠结"要不要给AI更多权限"时,前沿的工程团队已经在用Harness Engineering理念,让AI Agent自主完成从需求分析到测试部署的全流程开发。最近6小时深… 2026/7/11 13:30:58
applera1n终极指南:三步完成iOS 15-16激活锁绕过 applera1n终极指南:三步完成iOS 15-16激活锁绕过 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 还在为二手iPhone的激活锁而烦恼吗?忘记了旧设备的Apple ID密码?ap… 2026/7/11 13:28:57
别靠增加 HR 人手缓解社招压力,流程数字化才是提效核心路径 社招效率低,根本原因不是人手不够,而是流程设计本身就在制造浪费。社会招聘(社招)区别于校招的核心在于:候选人质量参差不齐、渠道分散、决策链条长,每一个环节的摩擦都会以指数级方式放大招聘周期。要系统… 2026/7/11 13:24:56
如何3分钟永久解锁IDM下载管理器?终极免费激活脚本完全指南 如何3分钟永久解锁IDM下载管理器?终极免费激活脚本完全指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager&#x… 2026/7/11 13:24:56
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/11 12:30:52
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08