二分查找变种:在有序数组中查找目标值范围
1. 问题背景与核心需求这道算法题来自LeetCode第34题属于二分查找的经典变种。题目要求在一个已排序的整数数组中找出给定目标值的第一个和最后一个出现位置。如果目标值不存在于数组中则返回[-1, -1]。在实际开发中这类需求非常常见。比如日志系统中查询某个错误码首次和最后一次出现的时间戳用户行为分析中统计某个操作在时间序列上的起始和结束位置数据库查询结果中定位某个值的边界范围2. 算法设计思路解析2.1 暴力解法与优化空间最直观的解法是线性扫描从左到右遍历记录第一个等于target的位置继续遍历直到找到最后一个等于target的位置时间复杂度O(n)空间复杂度O(1)但题目给出的数组是有序的这提示我们可以使用二分查找进行优化。有序数组查找问题二分法通常能将时间复杂度降至O(log n)。2.2 二分查找的变形应用标准二分查找在找到目标值后会立即返回但我们需要找到边界位置。因此需要修改二分逻辑查找第一个等于target的位置当nums[mid] target时不立即返回继续向左半部分搜索直到确认mid是最左侧的target查找最后一个等于target的位置当nums[mid] target时不立即返回继续向右半部分搜索直到确认mid是最右侧的target3. 代码实现与细节分析3.1 查找左边界实现def find_left(nums, target): left, right 0, len(nums) - 1 while left right: mid left (right - left) // 2 if nums[mid] target: right mid - 1 else: left mid 1 return left if left len(nums) and nums[left] target else -1关键点当nums[mid] target时继续向左搜索(right mid - 1)循环结束时left指向第一个等于target的位置需要检查left是否越界以及是否真的等于target3.2 查找右边界实现def find_right(nums, target): left, right 0, len(nums) - 1 while left right: mid left (right - left) // 2 if nums[mid] target: left mid 1 else: right mid - 1 return right if right 0 and nums[right] target else -1关键点当nums[mid] target时继续向右搜索(left mid 1)循环结束时right指向最后一个等于target的位置需要检查right是否越界以及是否真的等于target3.3 完整解决方案class Solution: def searchRange(self, nums: List[int], target: int) - List[int]: def find_left(): left, right 0, len(nums) - 1 while left right: mid left (right - left) // 2 if nums[mid] target: right mid - 1 else: left mid 1 return left if left len(nums) and nums[left] target else -1 def find_right(): left, right 0, len(nums) - 1 while left right: mid left (right - left) // 2 if nums[mid] target: left mid 1 else: right mid - 1 return right if right 0 and nums[right] target else -1 return [find_left(), find_right()]4. 边界条件与测试用例4.1 必须考虑的边界情况空数组输入nums [], target 0 → [-1, -1]目标值不存在nums [1,2,3], target 4 → [-1, -1]单个元素匹配nums [1], target 1 → [0, 0]所有元素相同nums [2,2,2], target 2 → [0, 2]目标值在开头/结尾nums [1,2,2,3], target 1 → [0,0]4.2 测试用例验证def test_searchRange(): solution Solution() assert solution.searchRange([5,7,7,8,8,10], 8) [3,4] assert solution.searchRange([5,7,7,8,8,10], 6) [-1,-1] assert solution.searchRange([], 0) [-1,-1] assert solution.searchRange([1], 1) [0,0] assert solution.searchRange([2,2], 2) [0,1]5. 算法复杂度分析时间复杂度O(log n)两次二分查找每次都是O(log n)没有嵌套循环总体保持对数复杂度空间复杂度O(1)只使用了常数级别的额外空间递归实现的空间复杂度会是O(log n)因此推荐迭代写法6. 实际应用中的优化技巧提前终止优化if not nums: return [-1, -1] if target nums[0] or target nums[-1]: return [-1, -1]合并查找过程可以在一次二分查找中同时记录左右边界但代码会变得复杂可读性降低使用bisect模块(Python)import bisect left bisect.bisect_left(nums, target) right bisect.bisect_right(nums, target) - 1 return [left, right] if left right else [-1, -1]7. 常见错误与调试技巧7.1 典型错误模式无限循环终止条件写错while left right 可能导致漏判区间更新错误left mid 而不是 left mid 1边界判断错误未检查最终位置是否真的等于target数组越界访问nums[left] 可能超出索引范围重复计算在找到左边界后右边界可以从左边界开始搜索不必每次都从0开始7.2 调试方法打印中间状态print(fleft{left}, right{right}, mid{mid}, nums[mid]{nums[mid]})小数据测试用长度为1-3的数组测试更容易发现边界条件问题对比标准库用bisect模块的结果作为参照确保自定义实现的正确性8. 扩展思考与变种问题统计出现次数找到左右边界后出现次数 right - left 1时间复杂度仍为O(log n)模糊匹配查找第一个大于等于target的位置查找最后一个小于等于target的位置二维矩阵搜索在每行有序的矩阵中查找目标值范围可以结合行间二分和行内二分流数据场景数据以流形式到达无法随机访问需要调整算法设计思路在解决这类二分查找变种问题时核心是理解标准二分法的变通方式。记住关键原则在找到目标时不立即返回而是继续向目标方向搜索以确定边界位置。

相关新闻

线性代数与量子力学:傅里叶变换如何成为连接两者的桥梁

线性代数与量子力学:傅里叶变换如何成为连接两者的桥梁

1. 从一道“送命题”说起:线性代数和量子力学到底啥关系先交代个背景。我在某学习社区刷到一个帖子,标题就是“线性代数 or 量子力学?”,底下讨论得不可开交。有人觉得量子力学全靠线性代数撑着,没有矩阵就寸步难行&am…

2026/10/14 0:25:49 阅读更多 →
Delta机器人正逆解:MATLAB并联机构运动学建模与实现

Delta机器人正逆解:MATLAB并联机构运动学建模与实现

简介:基于MATLAB的源码资源聚焦Delta并联机器人的运动学正逆解,面向机器人控制、自动化领域的学习者与研究人员,解决关节角度与末端执行器位置之间的换算问题。在Delta这类三自由度并联机构中,正逆解是运动控制、轨迹规划与精度分…

2026/10/14 0:24:49 阅读更多 →
ArcGIS全国地图制图全流程:坐标系处理、符号化与批量出图

ArcGIS全国地图制图全流程:坐标系处理、符号化与批量出图

简介:“ArcGIS全国地图”是一套面向GIS应用与规划研究人员的全国地理空间数据包,整合地级区划、省界、河流湖泊及九段线等核心要素,可支撑地图制图、区域统计、空间查询与专题分析等多类应用场景。包体共103个文件,以Shapefile矢量…

2026/10/14 0:24:49 阅读更多 →

最新新闻

LoadRunner 12录制+11压测:APP后端并发测试实战指南

LoadRunner 12录制+11压测:APP后端并发测试实战指南

简介:这份资源面向移动端性能测试工程师与后端开发人员,聚焦APP后台服务器的压力测试场景,解决LoadRunner无法直接录制手机APP脚本的痛点。核心思路是借助LoadRunner12的代理录制能力抓取APP请求,再将调试好的脚本放到LoadRunner1…

2026/10/14 6:59:33 阅读更多 →
Agent规模化落地:执行环境才是第一道坎

Agent规模化落地:执行环境才是第一道坎

1. 为什么Agent规模化,第一关就卡在执行环境过去大半年,我一直在用DeepSeek现成的API做Agent类项目。说实话,单机版玩Agent,体验是相当愉快的:模型推理能力在线、上下文窗口够用、工具调用也越来越稳,几个关…

2026/10/14 6:59:33 阅读更多 →
纯白主题紧凑型主机装机避坑指南

纯白主题紧凑型主机装机避坑指南

“男孩子的婚纱”这句话,第一次听到时我笑了,笑完之后又觉得特别贴切。攒钱、选件、等快递、拧螺丝、理线、反复点亮又拔掉重来,最后把侧板盖上,按下开机键的那一下整台机器亮起来——那个瞬间的满足感,真的不亚于新娘…

2026/10/14 6:59:33 阅读更多 →
限制性三体问题数值仿真:从平动点到混沌轨道的工程实践

限制性三体问题数值仿真:从平动点到混沌轨道的工程实践

我最早被这个题目绊住,是A同学拿一个半成品代码来问:为什么轨道一旦靠近其中一颗主星,几秒之后就彻底崩了。那个代码写的是平面限制性三体问题——两个大质量天体在同一个平面内绕公共质心匀速转动,第三个小质量天体只受它们的引力…

2026/10/14 6:59:33 阅读更多 →
一个人用AI做六种短视频账号:漫剧、数字人、绘本全流程拆解

一个人用AI做六种短视频账号:漫剧、数字人、绘本全流程拆解

最近老同学跑来问我,一个人能不能同时做五六种短视频账号。我说能,但关键不是你会剪辑,而是你有没有一套能复用的AI工作流。你看现在站内最活跃的漫剧号、数字人口播号、绘本故事号,背后很可能就是一个人:选题用AI&…

2026/10/14 6:59:33 阅读更多 →
Python静态检查实战:pychecker原理、配置与CI接入指南

Python静态检查实战:pychecker原理、配置与CI接入指南

简介: pychecker 是一款面向 Python 开发者的静态代码分析工具,能在程序运行前检查语法错误、类型不匹配、未定义引用、未使用变量、循环依赖等问题。压缩包对应 pychecker-0.8.19 版本,除可直接执行的脚本外,还包含完整源代码…

2026/10/14 6:58:33 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →