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

二分查找实战:旋转排序数组最小值与点名问题

二分查找适用于有序数据的快速定位。针对旋转排序数组找最小值,利用数组分段递增特性,比较中点与基准值收缩范围。点名缺失数字问题则依据元素值与下标关系构建二段性,定位首个不匹配位置。两种场景均将复杂度优化至 O(log n),掌握此“二段性”思维可高效解决此类有序序列问题。

芝士奶盖发布于 2026/3/22更新于 2026/9/958 浏览
二分查找实战:旋转排序数组最小值与点名问题

二分查找实战:旋转排序数组最小值与点名问题

二分查找不仅是基础算法,更是处理有序数据的高效利器。本文将通过两道经典题目,深入剖析如何利用'二段性'思想优化查找逻辑。

1. 寻找旋转排序数组中的最小值

题目描述

已知一个长度为 n 的升序数组,经过 1 到 n 次旋转后得到输入数组。例如 [3,4,5,1,2] 是 [1,2,3,4,5] 旋转后的结果。请找出其中的最小元素。

旋转数组示意图

解题思路

旋转后的数组可以看作由两个有序子数组组成,且前一部分的所有元素都大于等于后一部分的元素。最小值恰好位于这两个部分的交界处。

我们可以利用二分查找来定位这个分界点。核心在于确定 mid 落在哪个区间:

  • 如果 nums[mid] 大于等于起始元素 nums[0],说明 mid 落在左半部分(较大值区域),最小值一定在右侧。
  • 如果 nums[mid] 小于 nums[0],说明 mid 落在右半部分(较小值区域),最小值可能在左侧或就是 mid 本身。

当左右指针相遇时,即找到了最小值。

代码实现

class Solution {
public:
    int findMin(vector<int>& nums) {
        int n = nums.size();
        int left = 0, right = n - 1;
        
        // 如果数组没有旋转,直接返回第一个元素
        if (nums[0] <= nums[n - 1]) {
            return nums[0];
        }
        
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] >= nums[0]) {
                left = mid + 1;
            }  {
                right = mid;
            }
        }
         nums[left];
    }
};
else
return

2. 点名(缺失数字)

题目描述

在一个从 0 到 n-1 的升序数组中,有一个数字缺失。请找出这个缺失的数字。

点名示例图

解题思路

如果没有缺失,数组下标 i 对应的值应该是 i。一旦某个位置的值 nums[i] > i,说明该位置之前出现了缺失。

这构成了典型的'二段性':

  • 缺失位置左侧:nums[i] == i
  • 缺失位置右侧:nums[i] != i

利用这一性质进行二分查找,找到第一个满足 nums[i] != i 的位置,即为缺失数字。若遍历结束仍未发现不匹配,则缺失的是最后一个数字 n。

代码实现

class Solution {
public:
    int takeAttendance(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == mid) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        // 检查最终位置是否匹配
        if (nums[left] == left) {
            return left + 1;
        }
        return left;
    }
};

总结

这两道题展示了二分查找的变体应用。关键在于识别出题目中隐含的单调性或分段特征,从而定义出有效的 check 条件。掌握这种'根据 mid 状态收缩区间'的思维模式,能帮助你应对更多复杂的搜索问题。

目录

  1. 二分查找实战:旋转排序数组最小值与点名问题
  2. 1. 寻找旋转排序数组中的最小值
  3. 题目描述
  4. 解题思路
  5. 代码实现
  6. 2. 点名(缺失数字)
  7. 题目描述
  8. 解题思路
  9. 代码实现
  10. 总结

更多推荐文章

查看全部
  • 主流大模型英文降重能力横向评测:千问 DeepSeek 等工具实测
  • vscode copilot在win10 WSL2环境无法使用的问题
  • GitHub Copilot SDK 与云原生多智能体系统构建
  • Linux 进程信号的产生机制详解
  • HarmonyOS 应用集成静默登录与端云一体功能实践
  • 从后端视角理解前端三基石:HTML、CSS 与 JavaScript
  • A*算法在网格路径规划中的三种优化策略对比与实战
  • AIOps 实践:基于 Dify+LangBot 实现飞书智能体对话机器人
  • Spring Boot 核心注解完全手册
  • 为什么 Java 一行代码 JVM 要执行 4 条指令
  • 二分查找算法详解:山峰数组的峰顶索引与寻找峰值
  • IntelliJ IDEA 2026.1 EAP 发布:Java 26 与 Spring Boot 4 支持
  • Python Web 框架对比与实战:Django vs Flask vs FastAPI
  • 用 OpenClaw 和 Claude 搭建自动化写作系统
  • 教育类论文降重与 AIGC 检测的双重优化策略
  • LangChain 消息处理详解:缓存、过滤、合并与流式输出
  • 微信小程序跳转外部链接:WebView 与复制链接方案
  • 融合语言模型的多模态触觉传感器 SuperTac 实现类人感知
  • WebGL 无代码 3D 交互设计平台:翠鸟艺术家技术解析
  • MATLAB 与 Python 混合编程技术原理与实战

相关免费在线工具

  • 加密/解密文本

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

  • Gemini 图片去水印

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

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online