Hot100:在排序数组中查找元素的起始和结束位置,一套二分模板搞定 Search Range(LeetCode 34)
副标题 / 摘要 很多同学会写“找一个等于目标的二分”,但一到“找目标的起始和结束位置”就容易被边界条件卡住。本文用统一的下界 / 上界二分模板,彻底吃透 Search Range 类型问题,并给出多语言实现和工程场景示例。 预计阅读时长:10~15 分钟 适用场景标签:二分查找、日志区间查询、时间序列检索 SEO 关键词:search range, first and last position, 二分查找边界, lower_bound, upper_bound, LeetCode 34, Hot100 目标读者与背景 目标读者 已经知道二分查找基本写法,但一到“找起始位置/结束位置”就容易出错的同学; 经常对日志、监控指标做时间区间检索的工程师; 准备面试时希望掌握一套可复用二分模板的开发者。 背景 / 动机 几乎所有互联网系统里都有“按时间排序的日志 / 事件 / 指标”: 比如按时间排序的访问日志; 按上报时间排序的监控数据点; 按 ID 排序的业务记录。 在这些有序数据上,最常见的操作之一就是: 找出“所有值等于 X 的记录”的区间 [start, end]。 这道 LeetCode 经典题「Search for a Range」正是这个需求的抽象版本。 A — Algorithm(题目与算法) 题目重述 给定一个按非降序排序的整数数组 nums 和一个目标值 target。 请在数组中找到目标值的起始位置和结束位置,以数组 [start, end] 形式返回。 如果数组中不存在目标值,返回 [-1, -1]。 要求时间复杂度为 O(log n)。 ...