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

算法实战:二分查找解决旋转数组最小值与缺失数字

二分查找在旋转排序数组找最小值及有序数组找缺失数字场景下的应用。针对旋转数组,利用二段性比较中点与右端点收缩范围;针对缺失数字,依据元素值与下标关系定位断点。提供 C++ 实现代码及流程解析,时间复杂度优化至 O(logN)。

RefactorPro发布于 2026/3/24更新于 2026/6/2422 浏览
算法实战:二分查找解决旋转数组最小值与缺失数字

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

题目链接

153. 寻找旋转排序数组中的最小值 - 力扣

题目描述

文章配图

题目示例

文章配图

解法(二分查找)

算法思路

题目中的数组规则如下图所示:

文章配图

其中 C 点就是我们要求的点。二分查找的核心,在于确立一个判断标准,将搜索区间一分为二。

通过图像我们可以发现,【A,B】区间内的点都是严格大于 D 点的值,C 点的值是严格小于 D 点的值。但是当【C,D】区间只有一个元素的时候,C 点的值是可能等于 D 点的值。

因此,初始化左右两个指针 left,right:然后根据 mid 的落点,我们可以划分下一个查询的区间:

  • 当 mid 在【A,B】区间的时候,也就是 mid 位置的值严格大于 D 点的值,下一次查询区间在【mid+1,right】上;
  • 当 mid 在【C,D】区间的时候,也就是 mid 位置的值严格小于等于 D 点的值,下次查询区间【left,mid】在上。

当区间长度变成 1 的时候,就是我们要找的结果。

C++ 算法代码(以 nums[n - 1] 为参照物)
class Solution {
 public:
  int findMin(vector<int>& nums) {
    // 选择 nums[n - 1] 作为参照物
    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];
  }
};
C++ 算法代码(以 nums[0] 为参照物)
class Solution {
 public:
  int findMin(vector<int>& nums) {
    // 选择 nums[0] 作为参照物
    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 相遇的位置是数组最大值,
    // left+1 位置则是最小值 (数组不是一直递增的情况)
    if (left == nums.size() - 1) // 特殊情况:旋转到数组一直递增
      return nums[0];
    return nums[left + 1];
  }
};
算法总结及流程解析

文章配图

文章配图

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

题目链接

LCR 173. 点名 - 力扣(LeetCode)

题目描述

文章配图

题目示例

文章配图

解法(二分查找)

算法思路

关于这道题中,时间复杂度为 O(N) 的解法有很多种,而且也都比较好想到,这里就不再赘述。本题我们主要介绍的是一个时间复杂度为 O(logN) 的最优解法二分法:

在这个升序的数组中,我们发现:

  • 在第一个缺失位置的左边,数组内元素都是与数组下标相等的;
  • 在第一个缺失位置的右边,数组内的元素都是与数组下标不相等的。

因此,我们可以利用这个【二段性】,来使用【二分查找】算法。

C++ 算法代码
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;
  }
};
算法总结及流程解析

文章配图

目录

  1. 23. 寻找旋转排序数组中的最小值
  2. 题目链接
  3. 题目描述
  4. 题目示例
  5. 解法(二分查找)
  6. 算法思路
  7. C++ 算法代码(以 nums[n - 1] 为参照物)
  8. C++ 算法代码(以 nums[0] 为参照物)
  9. 算法总结及流程解析
  10. 24. 0~n-1 中缺失的数字
  11. 题目链接
  12. 题目描述
  13. 题目示例
  14. 解法(二分查找)
  15. 算法思路
  16. C++ 算法代码
  17. 算法总结及流程解析
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Llama-3.2-3B 实战:使用 Ollama 生成营销文案
  • MySQL 中文乱码问题的原因及解决方案
  • NestJS 接口响应 Message 编写规范与 API 提示标准化
  • RPA vs Agent:核心区别、架构与应用场景深度解析
  • Java Web 学习:前端 HTML 核心知识点总结
  • 数字图像处理与FPGA实现:算法与硬件思维的桥梁
  • K-RagRec:基于知识图谱检索增强的大语言模型推荐框架
  • Python 爬虫基础入门与实战详解
  • 如何转行成为产品经理?
  • Python 库 adaptnlp 语法、参数及实际应用案例
  • 基于扣子平台搭建多功能 AI 女友机器人教程
  • Openclaw 与 Scrapling 手动部署及 Walmart 数据采集策略
  • 轻量 4B 模型视频理解实测:Qwen3-VL-WEBUI 部署与效果
  • Linux 常用命令详解与实战示例
  • 链表算法专题:常用技巧与经典题目解析
  • 蓝桥杯C/C++大学B组省赛真题解析与实战技巧
  • C++ 多态概念、实现及原理详解
  • Python 数据统计指南:从入门到实战
  • C++ 容器适配器详解:Stack、Queue 与 Deque 原理
  • 无人机航测内业处理教程:iTwin Capture Modeler 建模流程

相关免费在线工具

  • 加密/解密文本

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