[优选算法专题三二分查找——NO.18在排序数组中查找元素的第一个和最后一个位置]

题目链接:

34. 在排序数组中查找元素的第一个和最后一个位置

题目描述:


题目解析:

1. 边界判断:处理空数组
  • 若数组为空,直接返回 [-1,-1],避免后续索引访问越界。
2. 第一步:二分查找「左边界」(第一个等于 target 的位置)

关键逻辑

通过调整 right 的取值(始终指向「可能是左边界」的位置),最终 left 会收敛到 第一个等于 target 的索引。

  • nums[mid] < target:说明 mid 及左边都不可能是左边界,左边界必须在 mid+1 右侧;
  • nums[mid] >= target:说明 mid 可能是左边界,或左边界在 mid 左侧,因此将 right 收缩到 mid。
3. 第二步:二分查找「右边界」(最后一个等于 target 的位置)

关键逻辑

通过调整 left 的取值(始终指向「可能是右边界」的位置),最终 right 会收敛到 最后一个等于 target 的索引

  • 为什么要 +1
  • 若不 +1,当 right = left + 1 时,mid = left + (right-left)/2 = left,若 nums[mid] <= targetleft 仍会停在 left,导致无限循环。
  • 例如:nums = [8,8]left=0right=1,不 +1mid=0nums[mid]<=8left=0,循环永远不结束;+1mid=1nums[mid]<=8left=1,循环结束。

核心优势与注意事项

优势
  1. 高效性:二分查找的时间复杂度为 O (log n),适合大规模有序数组;
  2. 鲁棒性:处理了空数组、target 不存在、target 仅出现一次等所有边界情况;
  3. 无冗余:先找左边界,再基于左边界找右边界,避免重复计算。
注意事项
  1. 数组必须有序:代码依赖「非递减排序」的前提,若数组无序,需先排序(但排序会改变原索引,失去意义);
  2. 避免整数溢出 :计算 mid 时用 left + (right-left)/2 而非 (left+right)/2,防止 left+right 超过 int 最大值;
  3. 右边界的 +1 细节 :必须在计算右边界的 mid 时加 1,否则会出现死循环。

相关推荐
大鱼>5 小时前
因子挖掘+回测+RL交易:量化金融完整系统
人工智能·深度学习·算法·金融
2301_777998346 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++
啦啦啦啦啦zzzz6 小时前
设计模式:单例模式和工厂模式
c++·单例模式·设计模式·工厂模式
Henry Zhu1236 小时前
C++ 动态多态详解
c++
此生决int6 小时前
深入理解C++系列(06)——模版初阶与STL
开发语言·c++
c238566 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
noipp6 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室6 小时前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法
冻柠檬飞冰走茶7 小时前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
鱼子星_7 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归