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

旋转排序数组二分查找解法:LeetCode 33 题实战

旋转排序数组搜索问题的关键在于利用局部有序性维持二分查找效率。通过比较 mid 与边界值判断哪一侧有序,进而决定搜索方向。该方法能在 O(log n) 时间内完成查找,无需遍历整个数组。代码实现了标准二分逻辑,适用于无重复元素的旋转数组场景。

雾岛听风发布于 2026/3/29更新于 2026/7/2331 浏览
旋转排序数组二分查找解法:LeetCode 33 题实战

题目描述

整数数组 nums 原本按升序排列,但在传递给函数前,它在某个未知下标 k 处进行了旋转。

例如,[0,1,2,4,5,6,7] 在下标 3 处旋转后可能变为 [4,5,6,7,0,1,2]。

给定旋转后的数组 nums 和一个整数 target,如果 nums 中存在这个目标值,则返回它的下标,否则返回 -1。必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

解题思路

面对旋转后的有序数组,核心难点在于如何保持二分查找的 O(log n) 效率。由于数组被切断并拼接,整体不再单调,但局部依然有序。这意味着在任意一次二分迭代中,mid 左右两侧必定有一侧是严格有序的。

我们可以利用这一特性来缩小搜索范围:

  1. 判断 mid 位置:首先检查 nums[mid] 是否等于 target,相等则直接返回。
  2. 确定有序区间:比较 nums[left] 和 nums[mid]。
    • 若 nums[left] <= nums[mid],说明左半部分 [left, mid] 是有序的。此时再判断 target 是否落在该区间内。若在,则收缩右边界 right = mid - 1;否则收缩左边界 left = mid + 1。
    • 若 nums[left] > nums[mid],说明左半部分无序,那么右半部分 [mid, right] 必然是有序的。同样判断 target 是否在右半区间内,决定移动 left 还是 right。
  3. 循环终止:当 left > right 时仍未找到,返回 -1。

这种逻辑确保了每次都能排除一半的无效区间,从而满足对数级时间复杂度的要求。

代码实现

下面是完整的 C++ 实现,包含了必要的注释以辅助理解逻辑分支。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size() - 1;
        
        while (left <= right) {
            // 防止溢出的中间值计算
            int mid = left + (right - left) / 2;
            
            // 找到目标值直接返回
            if (nums[mid] == target) {
                return mid;
            }
            
            // 判断左半部分是否有序
            if (nums[left] <= nums[mid]) {
                // 左半部分有序,判断 target 是否在左半部分
                if (nums[left] <= target && target < nums[mid]) {
                    right = mid - ;
                }  {
                    left = mid + ;
                }
            }  {
                
                 (nums[mid] < target && target <= nums[right]) {
                    left = mid + ;
                }  {
                    right = mid - ;
                }
            }
        }
        
         ;
    }
};
1
else
1
else
// 右半部分有序,判断 target 是否在右半部分
if
1
else
1
return
-1

调试与验证

以输入 nums = [4,5,6,7,0,1,2], target = 0 为例:

初始状态 left = 0, right = 6。mid 指向 7,左侧有序但 target 不在 [4, 7] 之间,因此 left 移至 4。

第二次迭代 left = 4, right = 6。mid 指向 1,左侧 [0,1,2] 有序且包含 target,right 移至 4。

第三次迭代 left = 4, right = 4。mid 指向 0,匹配成功,返回索引 4。

整个过程清晰展示了如何利用局部有序性快速定位目标。

复杂度分析

  • 时间复杂度:O(log n)。每次迭代都将搜索空间减半。
  • 空间复杂度:O(1)。仅使用常数个变量。

目录

  1. 题目描述
  2. 解题思路
  3. 代码实现
  4. 调试与验证
  5. 复杂度分析
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • RabbitMQ 事务机制与消息限流实战详解
  • Web 开发中五种常用加密算法实战与原理
  • 基于 Leaflet-Trackplayer 的高速公路轨迹 WebGIS 可视化实战
  • DeepSeek R1 个人 AI 知识库搭建指南(API 与本地部署)
  • TypeScript 首超 Python 成 GitHub 最活跃语言:2025 开发趋势
  • 青少年机器人编程系统化学习路径:从机械启蒙到人工智能
  • 人工智能:自然语言处理在教育领域的应用与实战
  • ChatGPT 与大模型领域精选参考书推荐
  • 大模型应用:RAG 原理、流程与最佳实践
  • 前端常用加密算法与实现
  • 数据结构核心:KMP 算法、Trie 树与并查集实战解析
  • 毕业论文 AI 辅助写作全流程实操指南
  • 把AI当队友用:MonkeyCode的真实项目体验
  • JavaScript 空值判断工具函数
  • MySQL 常用命令速查表
  • 大模型常见面试题汇总与答案解析
  • LLaMA-Factory 详细安装教程
  • RabbitMQ 与 Spring Boot 集成实战:从 Hello World 到生产配置
  • 从多库并存到一库多能:金仓 KingbaseES 融合架构实践
  • Revit 模型 Web 可视化:Revit2GLTF 转换方案详解

相关免费在线工具

  • 加密/解密文本

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