跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

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

二分查找在有序数据处理中效率显著。针对旋转排序数组最小值问题,通过比较中点与边界值确定单调区间;点名问题则利用元素值与下标的一致性进行二分定位。C++ 实现代码展示具体逻辑,时间复杂度优化至 O(logn),帮助理解“二段性”在算法中的应用。

MqEngine发布于 2026/3/30更新于 2026/5/25 浏览
二分查找实战:旋转排序数组最小值与点名问题解析

二分查找实战:两道经典题目解析

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

题目描述

已知一个长度为 n 的升序数组,在某个未知的下标 k 处进行了旋转(例如 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。请找出其中最小的元素。

解题思路

这道题的核心在于利用二段性。虽然数组整体不是有序的,但旋转后形成的两个子区间各自是有序的。

我们可以将数组分为两部分:

  • 左半部分:所有元素都大于等于首元素 nums[0]
  • 右半部分:所有元素都小于等于首元素 nums[0]

最小值恰好位于这两部分的交界处。通过比较中间元素 mid 与首元素 nums[0] 的大小关系,可以判断 mid 落在哪个区间,从而收缩搜索范围:

  • 若 nums[mid] >= nums[0],说明 mid 在左半部分,最小值一定在右侧,令 left = mid + 1
  • 若 nums[mid] < nums[0],说明 mid 在右半部分,最小值可能在当前位置或左侧,令 right = mid

当 left == right 时,即找到最小值。

特殊情况处理:如果数组本身没有旋转(即 nums[0] <= nums[n-1]),直接返回首元素即可。

C++ 代码实现

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

        int left = 0;
        int right = n - 1;

        while (left < right) {
            int mid = left + (right - left) / 2;
            // 中点值大于等于首元素,说明在左半段有序区
            if (nums[mid] >= nums[0]) {
                left = mid + 1;
            } else {
                // 否则在右半段,最小值可能是 mid 或其左侧
                right = mid;
            }
        }
        return nums[left];
    }
};

2. 点名

题目描述

某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于递增数组 records,若某位同学缺席,则其学号缺失。请返回缺席同学的学号。

解题思路

这是一个典型的有序数组查找问题。观察数组特性可以发现明显的二段性:

  • 在缺失数字之前,所有元素值等于其下标(nums[i] == i)
  • 在缺失数字之后,所有元素值大于其下标(nums[i] > i)

利用这个性质,我们可以通过二分查找定位到第一个满足 nums[i] != i 的位置。该位置即为缺失数字的起始点。

具体逻辑如下:

  • 若 nums[mid] == mid,说明缺失数字在右侧,令 left = mid + 1
  • 若 nums[mid] != mid,说明缺失数字在左侧或就是当前位置,令 right = mid

循环结束后,left 指向第一个不匹配的位置。需要额外判断一下边界情况:如果遍历完所有元素都没有发现不匹配(即 nums[left] == left),说明缺失的是最后一个数字 n。

C++ 代码实现

class Solution {
public:
    int takeAttendance(vector<int>& nums) {
        int left = 0;
        int 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;
    }
};

总结

以上两道题目均利用了二分查找优化时间复杂度至 O(logn)。关键在于识别数据中的单调性或二段性,并据此设计判断条件来缩小搜索空间。在实际工程中,面对有序数据的检索、极值查找等问题,优先考虑二分法往往能获得更优的性能表现。

目录

  1. 二分查找实战:两道经典题目解析
  2. 1. 寻找旋转排序数组中的最小值
  3. 题目描述
  4. 解题思路
  5. C++ 代码实现
  6. 2. 点名
  7. 题目描述
  8. 解题思路
  9. C++ 代码实现
  10. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • TypeTale 免费 AIGC 视频创作工具简介
  • C++ STL list 容器详解:使用与模拟实现
  • C 语言快速排序算法详解与优化实现
  • CentOS环境下libwebkit2gtk-4.1-0安装配置手把手教程
  • 基于 Open-AutoGLM 的梦幻西游网页版自动化任务实现
  • 基于YOLOv10n-SOEP-PST的助老机器人目标检测系统详解
  • Seedance 2.0 双分支扩散变换器架构解析与工程实现
  • Python 数据分析入门:集中趋势与离散程度
  • AI 大模型学习的五大关键研究方向
  • SQL 注入攻击原理、案例与防御方案
  • Linux 下 UDP 网络编程套接字详解
  • GPT-4o mini 发布:多模态大模型技术解析与应用实践
  • Instagram 自动化工具常见问题解决:从依赖安装到运行错误排查
  • 量化金融领域主要职位解析:研究、开发与交易
  • C++ 模拟实现红黑树 (RBTree)
  • 腾讯 Matrix 框架 TracePlugin 源码分析:核心追踪器详解
  • Linux 运维命令速查:进程查看与日志分析
  • 命令行大模型上下文协议(MCP)交互工具:小巧的 MCPHost
  • Python 反爬进阶:Token/时间戳/签名机制无痕绕过实战
  • Linux 信号机制:产生方式、处理流程与系统调用

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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