跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

二分查找进阶:如何精准定位排序数组的边界

针对排序数组查找目标值起始和结束位置的问题,采用两次二分查找分别定位左右边界。关键在于利用二段性划分区间,并通过调整中点计算公式(向上或向下取整)来避免死循环。算法时间复杂度控制在 O(log n),需在循环结束后验证指针指向的值是否匹配目标。

落日余晖发布于 2026/3/16更新于 2026/6/618 浏览
二分查找进阶:如何精准定位排序数组的边界

题目背景

在 LeetCode 34 题中,给定一个按非递减顺序排列的整数数组 nums 和一个目标值 target,要求找出目标值在数组中的开始位置和结束位置。如果不存在,返回 [-1, -1]。

核心约束是算法的时间复杂度必须为 O(log n),这意味着我们不能使用线性扫描,而必须利用有序数组的特性进行二分查找。

核心思路:二段性

二分查找的本质是利用数据的二段性。对于排序数组,我们可以将区间划分为两部分:一部分满足条件(例如小于 target),另一部分不满足条件(大于等于 target)。通过不断缩小搜索范围,我们就能定位到分界点。

本题需要找到两个边界:

  1. 左边界:第一个大于等于 target 的位置。
  2. 右边界:最后一个小于等于 target 的位置。

避免死循环的关键

在编写二分查找时,最容易踩坑的就是死循环。这通常发生在计算中点 mid 的方式不当,导致指针无法移动。

  • 寻找左边界:当 mid 落在左侧区域时,我们需要向右收缩,即 left = mid + 1。此时 mid 的计算应偏向左侧,使用 left + (right - left) / 2。这样即使 left 和 right 相邻,mid 也会取 left,从而保证 left 能推进。
  • 寻找右边界:当 mid 落在右侧区域时,我们需要向左收缩,即 right = mid - 1。此时 mid 的计算应偏向右侧,使用 left + (right - left + 1) / 2。否则若 mid 取 left,会导致 right 无法更新,陷入死循环。

此外,循环条件通常使用 while(left < right)。当左右指针相遇时,循环终止,此时只需验证该位置是否为目标值即可。如果在循环内继续处理 left == right 的情况且逻辑不当,极易引发死循环。

代码实现

下面是一个完整的 Java 实现。为了清晰起见,我将查找左右边界的逻辑拆分为两个独立的二分过程。

public int[] searchRange(int[] nums, int target) {
    int[] ret = new int[2];
    ret[0] = ret[1] = -1;
    
    if (nums.length == 0) {
        return ret;
    }

    // 1. 查找左边界:第一个 >= target 的位置
       , right = nums.length - ;
     (left < right) {
        
           left + (right - left) / ;
        
         (nums[mid] < target) {
            
            left = mid + ;
        }  {
            
            right = mid;
        }
    }
    
    
     (nums[left] != target) {
         ret;
    }
    ret[] = left;

    
    
    
    right = nums.length - ;
     (left < right) {
        
           left + (right - left + ) / ;
        
         (nums[mid] <= target) {
            
            left = mid;
        }  {
            
            right = mid - ;
        }
    }
    
    ret[] = left;
     ret;
}
int
left
=
0
1
while
// 中点偏左,防止死循环
int
mid
=
2
if
// mid 落在左侧不满足条件的区域,向右移动
1
else
// mid 落在右侧满足条件的区域,包含 mid
// 循环结束后,left == right,需验证是否真的找到了 target
if
return
0
// 2. 查找右边界:最后一个 <= target 的位置
// 注意:这里可以复用之前的 left,但为了逻辑独立,重新初始化或从当前 left 开始均可
// 这里演示从原数组末尾开始查找,或者直接从找到的左边界开始优化
1
while
// 中点偏右,防止死循环
int
mid
=
1
2
if
// mid 落在左侧满足条件的区域,包含 mid
else
// mid 落在右侧不满足条件的区域,向左移动
1
1
return

关键点总结

  1. 循环条件:使用 left < right 而非 left <= right。因为当两者相等时,我们已经确定了唯一候选点,无需再进入循环判断。
  2. Mid 计算:
    • 找左边界(收缩右指针):mid = left + (right - left) / 2(向下取整)。
    • 找右边界(收缩左指针):mid = left + (right - left + 1) / 2(向上取整)。
  3. 边界验证:二分结束后,必须检查 nums[left] 是否等于 target,以防数组中根本不存在该元素。
  4. 时间复杂度:两次二分查找,总复杂度仍为 O(log n),满足题目要求。

通过这种结构化的二分策略,我们可以高效、准确地解决排序数组中的边界查找问题。

目录

  1. 题目背景
  2. 核心思路:二段性
  3. 避免死循环的关键
  4. 代码实现
  5. 关键点总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MySQL 表约束设计与查询进阶
  • 2025 年 GitHub 十大值得关注的开源项目
  • IPIDEA 网页抓取 API 实战:eBay 商品数据采集与 Python 接入
  • YOLOv10n-SOEP-PST 助老机器人目标检测系统详解
  • JetBrains IDEA 授权机制分析与合法使用方案建议
  • LogiOps 在 Linux 下配置 Logitech 鼠标完整教程
  • 瑞芯微 RK3588 基于深度学习的嵌入式人脸门禁与 IPC 安防监控系统
  • 李飞飞:武断 AI 政策损害开源社区;纽约大学教授称或被 Altman 误导
  • 一线互联网公司 Android 性能优化项目实战合集
  • 前端表格性能优化:虚拟滚动实现百万级数据流畅渲染
  • Linux 命令行参数与环境变量详解
  • Flutter spry 组件适配鸿蒙 HarmonyOS:轻量级 Web 框架与端侧微服务
  • 无人机平台与算法监督平台离线部署指南
  • AI 商业价值与盈利趋势深度解析
  • ABB 机器人虚拟示教器基础操作教程
  • 程序员求职现状分析:行业寒冬下的赛道选择与技能提升
  • MogFace 人脸检测模型在教育 OMO 平台的课堂专注度分析应用
  • Flutter tflite_web 在鸿蒙 Web 组件下的 AI 推理适配
  • ToDesk 顺网云 海马云部署 DeepSeek 大模型对比评测
  • 大模型入门自学资源汇总:书籍、开源项目与课程推荐

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online