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

二分查找实战:旋转数组最小值与缺失数字问题解析

旋转排序数组最小值与 0 到 n-1 缺失数字是二分查找的经典变体。前者利用数组旋转后的二段性,通过对比中点与端点值快速定位极值;后者则依赖元素值与下标的一致性特征,将线性查找优化至对数级别。C++ 实现中需特别注意边界收敛条件及特殊情况处理,确保算法在极端输入下的正确性。

芝士奶盖发布于 2026/3/23更新于 2026/5/66 浏览
二分查找实战:旋转数组最小值与缺失数字问题解析

二分查找实战:旋转数组最小值与缺失数字问题

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

题目描述 已知一个升序排列的数组经过若干次旋转后,例如 [3,4,5,1,2],请找出其中的最小元素。假设数组中不存在重复元素。

文章配图

解题思路 这道题的核心在于利用旋转数组的'二段性'。虽然整体不是有序的,但在旋转点两侧,大小关系是确定的。

想象一下,如果我们把数组首尾相连看成一个环,最小值就是那个'折点'。在二分查找中,我们需要找到一个判断标准,让搜索区间能不断缩小。通常有两种策略:

  1. 以右端点为基准:比较中间值 mid 和右端点 nums[right]。如果 mid 大于右端点,说明最小值在右侧(因为左半部分整体比右半部分大);否则最小值在左侧或就是 mid。
  2. 以左端点为基准:比较中间值 mid 和左端点 nums[left]。逻辑类似,但需要注意处理数组未发生旋转的特殊情况。

当左右指针相遇时,即找到了目标位置。

代码实现(以右端点为参照) 这种方式逻辑相对直观,不需要额外判断是否旋转。

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] > nums[nums.size() - 1]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return nums[left];
    }
};

代码实现(以左端点为参照) 这种写法需要多一步特殊判断,因为如果数组本身有序,left 可能会指向最大值而非最小值。

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        while(left < right) {
            int mid = left + (right - left + 1) / 2;
            if(nums[mid] >= nums[0]) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        // 循环结束 left 与 right 相遇的位置是数组最大值
        if(left == nums.size() - 1) {
            return nums[0];
        }
        return nums[left + 1];
    }
};

文章配图 文章配图 文章配图

2. 0~n-1 中缺失的数字

题目描述 一个长度为 n-1 的递增排序数组中的所有数字都在 0~n-1 范围内且无重复。找出其中缺失的那个数字。

文章配图

解题思路 暴力解法遍历一遍即可,但既然数组有序,我们可以用二分查找将复杂度降为 O(logN)。

观察发现,如果没有缺失数字,数组下标 i 对应的值应该是 i。一旦某个位置的值 nums[i] != i,说明缺失的数字就在该位置或其左侧。这就是典型的二段性:

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

我们只需要找到第一个满足 nums[i] != i 的位置,或者确定所有位置都匹配(此时缺失的是最后一个)。

代码实现

class Solution {
public:
    int takeAttendance(vector<int>& records) {
        int left = 0;
        int right = records.size() - 1;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(mid >= records[mid]) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        if(left == records[left]) {
            return records[left] + 1;
        }
        return records[left] - 1;
    }
};

文章配图 文章配图

这两道题展示了二分查找在不同约束条件下的变形应用。关键在于识别出问题的'单调性'或'二段性',从而定义出正确的 mid 移动规则。在实际编码中,务必注意边界条件的收敛,避免死循环。

目录

  1. 二分查找实战:旋转数组最小值与缺失数字问题
  2. 1. 寻找旋转排序数组中的最小值
  3. 2. 0~n-1 中缺失的数字
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 微信 ClawBot 插件支持个人微信及 Windows 安装方案
  • Struts 1 与 Struts 2 的核心区别对比
  • Git 入门实战:从零理解版本控制与团队协作
  • Stable Diffusion WebUI 文件夹结构与模型使用指南
  • Stable Diffusion WebUI 目录结构与 Nova Anime XL 模型实战
  • Spring Cloud Gateway 微服务网关核心解析
  • Spring Boot 微服务架构设计与实战
  • Spring Boot 数据缓存实战:集成、配置与注解详解
  • 呼入智能客服机器人实战:高并发场景下的架构设计与性能优化
  • Python 在 Windows 系统下的安装与 PyCharm 配置指南
  • Java IO流:从字节流到字符流
  • SDXL Prompt Styler 提示词风格增强工具使用指南
  • B 站网页版自动开启字幕用户脚本(2026 新版适配)
  • Java 程序员快速入门 Python:常见语法对照与常用库映射
  • 知网 AIGC 检测原理与论文降重实操指南
  • 2026 年 AI 大数据、大模型、AIGC 与云计算就业趋势分析
  • 基于 Python 的人脸识别控制 ESP8266 灯光闪烁
  • Windows 本地一键部署 OpenClaw 并对接飞书 AI 机器人
  • 互联网大厂算法工程师核心能力与入职条件解析
  • 使用 Biopython 快速解析 FASTA 与 GenBank 基因数据

相关免费在线工具

  • 加密/解密文本

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