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

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

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

雾岛听风发布于 2026/3/29更新于 2026/10/2591 浏览
旋转排序数组二分查找解法: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 - 1;
                } else {
                    left = mid + 1;
                }
            } else {
                // 右半部分有序,判断 target 是否在右半部分
                if (nums[mid] < target && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 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. 复杂度分析

更多推荐文章

查看全部
  • C++ 算法实战:排序子序列划分与 LIS 优化
  • 无人机红外照片处理中的温度校准与精度优化策略
  • 数据结构:常见时间复杂度与空间复杂度
  • Trae AI IDEA 插件实战指南:Java 开发效率提升
  • 基于 SpringBoot 的超市会员积分管理系统
  • Python 金融数据获取:同花顺问财工具使用指南
  • 基于 Go 语言构建命令行 AI 对话客户端:从环境部署到核心实现
  • 面向法律领域的大模型微调与应用
  • 2026 年求职指南:纯 LLM、多模态大模型与 AIGC 赛道对比
  • 人工智能大模型的安全与隐私保护:技术防御与合规实践
  • 直流无刷电机 FOC 控制算法详解
  • 2026 年 3 月全球大模型全景:国产登顶、百万上下文与智能体爆发
  • C 语言指针与数组的深层关系及实战
  • 大模型智能体(Agent)核心机制与开发指南
  • 大语言模型(LLM)学习路径:从入门到实战指南
  • 基于 ComfyUI 的 Stable Diffusion 本地部署与使用教程
  • 二分查找实战:山峰数组峰顶索引与寻找峰值
  • 微服务链路追踪实战:SkyWalking 与 Zipkin 架构对比及优化
  • 网络安全工程师职业发展与核心技能学习指南
  • 高频套利机器人开发实战:核心逻辑与避坑指南

相关免费在线工具

  • 加密/解密文本

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