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

LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置:二分查找实战

刷题路上二分查找是绕不开的经典算法而LeetCode 34题「在排序数组中查找元素的第一个和最后一个位置」正是二分查找的进阶应用——它不仅要求我们找到目标值更要精准定位其在非递减数组中的起始和结束位置同时还要满足O(log n)的时间复杂度要求。今天就来拆解这道题从题干分析到代码实现再到细节坑点一步步搞懂如何高效解决这道题。一、题干解析明确需求与约束先再仔细读一遍题干避免遗漏关键信息输入非递减顺序排列的整数数组nums目标值target输出target在数组中的开始位置和结束位置若不存在则返回[-1, -1]核心约束必须设计时间复杂度为O(log n)的算法。这里有两个关键点需要注意非递减数组数组元素可能重复且从左到右不递减允许相等这是二分查找的前提也是我们定位边界的核心依据O(log n)时间复杂度直接遍历数组O(n)会超时因此必须用二分查找且需要两次二分——分别找左边界第一个等于target的位置和右边界最后一个等于target的位置。二、解题思路两次二分查找定位左右边界既然数组是有序的我们可以利用二分查找的特性通过调整判断条件分别找到target的左边界和右边界左边界第一个大于等于target的位置如果target存在这个位置就是第一个target的索引如果不存在这个位置会大于数组长度或对应元素不等于target右边界第一个大于target的位置再减1如果target存在减1后就是最后一个target的索引如果不存在减1后会小于左边界。为了复用代码我们可以设计一个通用的二分查找函数通过一个布尔参数lower来控制查找左边界还是右边界当lower为true时查找左边界第一个target的位置当lower为false时查找右边界的“临界位置”第一个target的位置。最后通过判断左边界是否小于等于右边界、且边界对应的元素是否为target来确定最终结果——如果满足则返回[左边界, 右边界]否则返回[-1, -1]。三、代码实现与逐行解析先给出完整代码TypeScript版本再逐行拆解核心逻辑确保每一步都能理解functionsearchRange(nums:number[],target:number):number[]{constnnums.length;// 通用二分查找函数lower控制查找左边界/右边界临界值constbinarySearch(target:number,lower:boolean){letleft0,rightn-1,ansn;// ans初始化为n应对target大于所有元素的情况while(leftright){constmidMath.floor((leftright)/2);// 中间位置避免溢出// 关键判断根据lower调整二分方向if(nums[mid]target||(lowernums[mid]target)){rightmid-1;// 目标在左半区收缩右边界ansmid;// 记录当前mid可能是我们要找的边界}else{leftmid1;// 目标在右半区收缩左边界}}returnans;}letres:number[][-1,-1];// 初始化为不存在的情况constleftIdxbinarySearch(target,true);// 查找左边界constrightIdxbinarySearch(target,false)-1;// 查找右边界并调整// 验证边界的合法性左边界右边界且边界元素等于targetif(leftIdxrightIdxrightIdxnums.lengthnums[leftIdx]targetnums[rightIdx]target){res[leftIdx,rightIdx];}returnres;};核心代码逐行解析1. 初始化与通用二分函数定义const n nums.length; —— 记录数组长度避免多次调用nums.length提升效率。binarySearch函数接收target和lower两个参数返回对应边界的索引。这里ans初始化为n是为了应对target大于数组中所有元素的情况此时二分结束后ans仍为n后续rightIdx n-1会小于leftIdx直接返回[-1,-1]。2. 二分查找的核心判断逻辑if (nums[mid] target || (lower nums[mid] target))这是整个算法的灵魂分两种情况理解当lower为true找左边界只要nums[mid] target就说明左边界可能在mid或mid左侧因此收缩右边界right mid - 1并记录当前mid为候选边界ans mid当lower为false找右边界临界值只有nums[mid] target时才说明右边界临界值在mid或mid左侧收缩右边界否则继续向右查找。else { left mid 1; }当不满足上述条件时说明目标在mid右侧收缩左边界继续查找。3. 边界验证与结果返回leftIdx binarySearch(target, true)得到左边界第一个target的位置rightIdx binarySearch(target, false) - 1得到第一个target的位置减1后就是最后一个target的位置即右边界边界验证条件leftIdx rightIdx确保边界有效不会出现左边界在右边界右侧的情况、rightIdx nums.length避免数组越界、nums[leftIdx] target和nums[rightIdx] target确保找到的边界确实是target的位置而非其他值的边界。四、关键坑点与注意事项这道题看似简单但很多人在二分查找的边界处理上容易出错总结几个高频坑点ans的初始值必须设为n而不是-1。如果target大于数组中所有元素二分结束后left会超过rightans仍为n此时rightIdx n-1leftIdx nleftIdx rightIdx直接返回[-1,-1]避免出错二分循环条件必须是left right而不是left right。如果用left right可能会错过最后一个符合条件的元素比如数组中只有一个target时边界验证不能只判断leftIdx rightIdx还要验证nums[leftIdx]和nums[rightIdx]是否等于target。比如数组为[1,2,3,4]target为5此时leftIdx 4rightIdx 3不满足leftIdx rightIdx但如果target为0leftIdx 0rightIdx -1也不满足如果数组为[2,2]target为3leftIdx 2rightIdx 1同样不满足整数溢出mid的计算用Math.floor((left right) / 2)在JavaScript/TypeScript中整数范围足够大不会出现溢出但如果是其他语言如Java建议用left Math.floor((right - left)/2)避免leftright溢出。五、总结与拓展这道题的核心是「二分查找的边界定位」通过一次二分查找函数的复用分别找到左、右边界既满足了O(log n)的时间复杂度又简化了代码逻辑。拓展思考如果数组是递减的如何修改代码只需调整二分查找的判断条件将nums[mid] target改为nums[mid] target即可如果题目要求找到target的出现次数只需用右边界 - 左边界 1若存在target否则为0二分查找的核心是「收缩边界」只要明确“目标在左半区还是右半区”就能灵活调整判断条件解决各类边界查找问题。

相关文章:

LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置:二分查找实战

刷题路上,二分查找是绕不开的经典算法,而LeetCode 34题「在排序数组中查找元素的第一个和最后一个位置」,正是二分查找的进阶应用——它不仅要求我们找到目标值,更要精准定位其在非递减数组中的起始和结束位置,同时还要…...

py2exe终极指南:将Python脚本快速打包为独立Windows程序

py2exe终极指南:将Python脚本快速打包为独立Windows程序 【免费下载链接】py2exe Create standalone Windows programs from Python code 项目地址: https://gitcode.com/gh_mirrors/py/py2exe 你是否曾为Python程序部署而烦恼?想让你的Python脚本…...

OpenClaw本地知识库:nanobot处理私有化文档问答

OpenClaw本地知识库:nanobot处理私有化文档问答 1. 为什么需要本地知识库助手 去年我接手了一个技术文档整理项目,团队积累了超过2000份内部技术文档、会议纪要和产品说明。每次新人入职或者遇到特定技术问题时,我们都要在这些文档里大海捞…...

Nitrox模组:如何将Subnautica的单人深海恐惧变为团队协作冒险

Nitrox模组:如何将Subnautica的单人深海恐惧变为团队协作冒险 【免费下载链接】Nitrox An open-source, multiplayer modification for the game Subnautica. 项目地址: https://gitcode.com/gh_mirrors/ni/Nitrox 当你第一次潜入4546B行星的海洋时&#xff…...

(复现)基于观测器的事件触发跟踪一致性控制(非理想一般线性多 智能体系统) 复现参考文献

(复现)基于观测器的事件触发跟踪一致性控制(非理想一般线性多 智能体系统) 复现参考文献:《Observer-based Event-triggered Tracking Consensus of Non-ideal General Linear Multi-agent Systems 》①控制:设计了一个分布式观测…...

OpenClaw调试技巧:百川2-13B任务失败时的6种排查方法

OpenClaw调试技巧:百川2-13B任务失败时的6种排查方法 1. 为什么需要专门的调试方法? 上周我让OpenClaw自动整理一批会议录音转文字稿,结果凌晨3点收到飞书报警——任务卡在"正在分析关键内容"阶段。第二天检查发现,百…...

星图平台双镜像方案:OpenClaw与百川2-13B的隔离部署技巧

星图平台双镜像方案:OpenClaw与百川2-13B的隔离部署技巧 1. 为什么需要双镜像隔离部署 去年我在尝试将OpenClaw接入本地大模型时,踩过一个典型的坑:当模型需要更新或维护时,整个自动化流程就会中断。最严重的一次,模…...

从零开始:使用TypeScript快速构建浏览器RPG游戏的终极指南

从零开始:使用TypeScript快速构建浏览器RPG游戏的终极指南 【免费下载链接】RPG-JS Framework to create an RPG or MMORPG (with the same code) in the browser with Typescript 项目地址: https://gitcode.com/gh_mirrors/rp/RPG-JS 想要在浏览器中创建令…...

Yuzu模拟器终极指南:7天学会如何选择最佳版本和优化性能 [特殊字符]

Yuzu模拟器终极指南:7天学会如何选择最佳版本和优化性能 🎮 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads 还在为选择哪个Yuzu模拟器版本而头疼吗?😫 别担心&#x…...

探索FDTD仿真中的光栅衍射阶数与反射阶数相位

fdtd仿真,光栅衍射阶数,反射阶数相位,复现结果如图,通用方法在电磁学和光学领域,FDTD(时域有限差分法)仿真是一项强大的工具,它能帮助我们深入理解复杂的电磁现象。今天咱就来聊聊FD…...

深入解析时钟网络延迟(Clock Network Latency)的优化策略与实现原理

最近在搞一个分布式系统项目,性能压测时总发现吞吐量上不去,延迟时高时低。经过一番排查,定位到了“时钟网络延迟”这个平时不太起眼,但影响巨大的问题上。今天就来聊聊这个“时钟网络延迟”(Clock Network Latency&am…...

4个步骤掌握FederatedScope:从入门到实践的联邦学习全流程指南

4个步骤掌握FederatedScope:从入门到实践的联邦学习全流程指南 【免费下载链接】FederatedScope An easy-to-use federated learning platform 项目地址: https://gitcode.com/gh_mirrors/fe/FederatedScope 联邦学习作为隐私计算领域的核心技术,…...

基于Chrome WebRTC与语音大模型的端到端AI辅助开发实战

最近在做一个需要实时语音交互的智能应用,项目要求低延迟、高音质,并且要能集成一个语音大模型进行实时分析和反馈。经过一番技术选型和实践,最终选择了基于 Chrome WebRTC 技术栈来构建端到端的解决方案。整个过程踩了不少坑,也积…...

基于LiveQing流媒体平台实现大疆无人机等RTMP推流接入轻松实现Web网页直播+录像回放

大疆无人机RTMP推流接入LiveQing,轻松实现Web网页直播录像留存 在无人机直播场景中,大疆无人机凭借出色的空中视角和稳定的图传表现,成为应急救援、工程巡检、赛事直播、国土测绘等领域的首选设备。但很多用户在使用大疆无人机直播时&#xf…...

OpenClaw飞书机器人:GLM-4.7-Flash实现智能问答助手

OpenClaw飞书机器人:GLM-4.7-Flash实现智能问答助手 1. 为什么选择OpenClaw飞书GLM组合 去年我接手了一个技术文档整理项目,每天需要处理上百条来自不同渠道的技术咨询。手动回复效率低下,而公有云上的智能客服方案又存在数据安全顾虑。直到…...

深入解析cosyvoice接口:从技术原理到高效集成实践

在智能语音交互领域,cosyvoice接口正扮演着越来越重要的角色。它让智能客服能够进行更自然流畅的多轮对话,为在线教育平台提供了实时语音评测与反馈的能力,同时也让各类智能硬件实现了精准的远场语音唤醒和指令识别。这些场景都离不开一个稳定…...

嵌入式NMEA-0183零内存分配解析器设计与实现

1. NMEA-0183 协议解析库深度技术解析:面向嵌入式系统的轻量级、零内存分配实现 NMEA-0183(National Marine Electronics Association 0183)是全球航海电子设备事实上的标准通信协议,自1983年发布以来,已广泛应用于GPS…...

通信工程毕设项目推荐:面向新手的5个可落地实战选题与技术实现路径

最近在帮几个通信工程专业的学弟学妹看毕业设计,发现一个挺普遍的现象:大家理论知识学了不少,但真到了要动手做一个“能跑起来”的系统时,却常常无从下手。要么选题太“飘”,全是仿真和公式推导,最后代码都…...

OpenClaw性能监控:GLM-4.7-Flash响应延迟可视化方案

OpenClaw性能监控:GLM-4.7-Flash响应延迟可视化方案 1. 为什么需要监控OpenClaw性能 上周三凌晨两点,我被一阵急促的报警声惊醒。手机屏幕上显示着OpenClaw任务队列积压的警告——我的自动化内容发布流程卡在了"生成摘要"环节。这已经是本月…...

ChatGPT工作原理简述:从Transformer到AI辅助开发的实践指南

作为一名开发者,你可能已经无数次地与ChatGPT进行过对话,惊叹于它流畅的文本生成能力,并将其API集成到自己的项目中。但你是否曾好奇,这个强大的“大脑”究竟是如何工作的?更重要的是,在激动人心的AI辅助开…...

Qwen3-4B模型微调指南:提升OpenClaw任务准确率

Qwen3-4B模型微调指南:提升OpenClaw任务准确率 1. 为什么需要微调Qwen3-4B模型 上周我在用OpenClaw整理项目文档时,发现它总是把设计稿和产品需求文档混为一谈。这个看似简单的问题背后,其实是底层Qwen3-4B模型对专业文档分类能力的不足。经…...

木马与恶意软件深度实战:查杀原理 + 免杀对抗全攻略(2026 珍藏版)

木马与恶意软件深度实战:查杀原理 免杀对抗全攻略(2026 珍藏版) 在网络安全的攻防对抗中,木马(Trojan Horse) 是最经典、最具代表性的恶意软件之一。它以 “伪装欺骗” 为核心手段,以 “远程控…...

百川2-13B-4bits+OpenClaw组合优化:5招降低Token消耗

百川2-13B-4bitsOpenClaw组合优化:5招降低Token消耗 1. 为什么需要关注Token消耗? 当我第一次将百川2-13B-4bits模型与OpenClaw对接时,就被Token消耗的速度震惊了。一个简单的文件整理任务,前后不到10分钟的操作,竟然…...

如何用Python脚本轻松抢到热门演唱会门票?大麦网自动抢票终极指南

如何用Python脚本轻松抢到热门演唱会门票?大麦网自动抢票终极指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 你是否曾经为抢不到心仪演唱会门票而烦恼&#…...

CogVideoX LoRA微调终极指南:用消费级GPU打造个性化视频生成模型

CogVideoX LoRA微调终极指南:用消费级GPU打造个性化视频生成模型 【免费下载链接】CogVideo text and image to video generation: CogVideoX (2024) and CogVideo (ICLR 2023) 项目地址: https://gitcode.com/GitHub_Trending/co/CogVideo 你是否曾经梦想过…...

物联网核心传感器技术详解与应用

1. 物联网系统中的关键传感器技术解析1.1 传感器在物联网中的核心作用现代物联网系统通过各类传感器实现物理世界与数字世界的连接。这些设备能够检测环境参数变化,并将采集到的模拟信号转换为数字数据,通过有线或无线网络传输至云端或本地处理单元。在工…...

3大突破!MiroFish群体智能引擎如何重构分布式协作系统?

3大突破!MiroFish群体智能引擎如何重构分布式协作系统? 【免费下载链接】MiroFish A Simple and Universal Swarm Intelligence Engine, Predicting Anything. 简洁通用的群体智能引擎,预测万物 项目地址: https://gitcode.com/GitHub_Tren…...

如何选择性价比高的宁波小程序开发服务公司?

在选择宁波小程序开发服务公司的过程中,内容概要的作用不可忽视。首先,应该明确找到一家能够提供专业服务的公司,同时懂得满足特定行业需求。此类公司通常拥有多样化的项目经验,可以展现出他们在不同领域的实际操作能力。有时候&a…...

基于STM32的智能鱼缸毕设任务书:新手入门实战指南与系统架构详解

最近在指导几位学弟学妹做毕业设计,发现“基于STM32的智能鱼缸”这个题目虽然经典,但新手在实际动手时,往往从第一步硬件选型就开始迷茫,到代码调试阶段更是问题频出。为了让大家少走弯路,我结合自己的项目经验&#x…...

OpenClaw故障排查:Qwen3-VL:30B飞书连接常见问题解决

OpenClaw故障排查:Qwen3-VL:30B飞书连接常见问题解决 1. 问题背景与排查准备 上周在星图平台部署Qwen3-VL:30B时,我遇到了OpenClaw与飞书连接的一系列"诡异"问题。从WebSocket莫名断开到模型响应超时,整个过程就像在解一个技术版…...