当前位置: 首页 > news >正文

LeetCode 每日一题笔记 日期:2026.05.22 题目:33. 搜索旋转排序数组

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.05.22
  • 题目:33. 搜索旋转排序数组
  • 难度:中等
  • 标签:数组、二分查找

1. 题目理解

问题描述
给定一个升序数组,在未知下标k处左旋后,得到数组nums(所有值互不相同)。给定目标值target,返回它在数组中的下标,不存在则返回-1。要求时间复杂度为O(log⁡n)O(\log n)O(logn)

示例

输入:nums = [4,5,6,7,0,1,2],target = 0
输出:4
解释:目标值0位于下标4。

输入:nums = [4,5,6,7,0,1,2],target = 3
输出:-1
解释:目标值不存在于数组中。

2. 解题思路

核心观察

  • 旋转后的数组仍保持局部有序:被mid分成的两个区间中,必有一个是完全有序的;
  • 利用二分查找,先判断mid所在的区间是否有序,再根据target与有序区间的边界关系,决定下一步的搜索方向。

算法步骤

  1. 初始化左右指针left = 0right = nums.length - 1
  2. 循环直到left > right
    • 计算mid = left + (right - left) / 2
    • nums[mid] == target,直接返回mid
    • 判断左半区是否有序(nums[mid] >= nums[left]):
      • target在左半区范围内,收缩右边界;
      • 否则收缩左边界;
    • 若右半区有序:
      • target在右半区范围内,收缩左边界;
      • 否则收缩右边界;
  3. 循环结束未找到,返回-1

3. 代码实现

packagelc33;publicclassSolution{publicintsearch(int[]nums,inttarget){intleft=0;intright=nums.length-1;while(left<=right){intmid=left+(right-left)/2;if(nums[mid]==target){returnmid;}// 左半区有序if(nums[mid]>=nums[left]){if(target>=nums[left]&&target<nums[mid]){right=mid-1;}else{left=mid+1;}}// 右半区有序else{if(target>nums[mid]&&target<=nums[right]){left=mid+1;}else{right=mid-1;}}}return-1;}}

4. 代码优化说明

减少冗余判断,通过逻辑等价简化分支,保持可读性的同时压缩代码:

packagelc33;publicclassSolution{publicintsearch(int[]nums,inttarget){intleft=0,right=nums.length-1;while(left<=right){intmid=left+(right-left)/2;if(nums[mid]==target)returnmid;if(nums[mid]>=nums[left]){left=(target>=nums[left]&&target<nums[mid])?left:mid+1;right=(target>=nums[left]&&target<nums[mid])?mid-1:right;}else{left=(target>nums[mid]&&target<=nums[right])?mid+1:left;right=(target>nums[mid]&&target<=nums[right])?right:mid-1;}}return-1;}}

5. 复杂度分析

  • 时间复杂度O(log⁡n)O(\log n)O(logn)
    二分查找每次将区间减半,最坏情况下执行log⁡2n\log_2 nlog2n次循环。

  • 空间复杂度O(1)O(1)O(1)
    仅使用常数级额外变量,无递归栈或额外数组开销。

6. 总结

  • 核心思路:局部有序的二分查找,利用旋转数组的特性,每次只在有序区间内判断目标值位置;
  • 关键技巧:通过nums[mid]nums[left]的大小关系,快速判断哪一侧区间有序;
  • 优化后代码通过三目运算符简化分支,逻辑更紧凑,同时保持原算法的正确性与时间复杂度。
http://www.jsqmd.com/news/880513/

相关文章:

  • 智能控制 第六章——集成智能控制系统
  • 基于SpringBoot+用户画像的商品个性化推荐毕业设计
  • Wireshark与FTK Imager电子证据采集实战指南
  • 从零开始单细胞分析:手把手教你用Scanpy复现PBMC3K教程(附避坑指南)
  • FPG平台:行业前景下的战略定位评估
  • 2026年当下常德卫生间防水公司实力盘点:优家房屋修缮中心为何备受青睐? - 2026年企业推荐榜
  • 2026年免费图片去水印保姆级教程:不用下载软件,微信小程序一步搞定
  • 渗透测试工具认知地图:从工作流理解工具本质
  • SpringBoot+Vue校车管理信息系统源码+论文
  • 首发!美团开源最强数字人 LongCat 1.5:性能狂飙15倍,8步闪电成片!
  • 基于Simulink的四开关buck-boost变换器闭环仿真模型
  • 四川钢板生产厂家名录|2026 年 5 月行情走势与价格预测 - 四川盛世钢联营销中心
  • 保姆级教程:在AirSim中用Python实现四旋翼的实时避障(附完整代码与避坑点)
  • SpringBoot+Vue实验室研究生信息管理系统源码+论文
  • 2026年Q2四川消防维修维保品牌名录及选型指南:成都消防维修口碑/消防技术服务/消防改造公司/消防改造多少钱/选择指南 - 优质品牌商家
  • 从原理到代码:用Python仿真TOA、TDOA和RSS定位算法(附GitHub源码)
  • Django 从 0 到 1 打造完整电商平台:购物车实现方式分析与模型设计
  • 基于静态动态障碍物DWA、DWA+RRT*、改进A*、RRT* 2D和3D的路径规划算法Matlab代码
  • OpenAI 推出的 GPT-5.5 大模型,倒逼接口芯片升级迭代@ACP#IX7024应用迭代
  • SpringBoot+Vue在线智慧考公系统源码+论文
  • Agent开发五层架构详解,AI智能体开发知识点
  • 基于模糊控制算法的水位控制研究(Matlab代码实现)
  • 保姆级教程:在Ubuntu 20.04上从零跑通VINS-Fusion并用EVO评测轨迹精度
  • 5分钟快速上手:免费开源Modbus调试工具QModMaster终极指南
  • LeetCode热题100-排序链表
  • Rust错误处理最佳实践:从Result到自定义错误类型
  • GPT-5.5 智能化全面普及,@ACP# IX、GSV 系列芯片构筑全层级硬件底座
  • 2026桥梁防撞护栏优质产品推荐榜:桥梁河道景观护栏、河道景观桥梁护栏、河道桥梁防撞护栏、灯光桥梁护栏、防撞道路护栏选择指南 - 优质品牌商家
  • 别乱调电源模式了!Win11隐藏的‘系统散热方式’设置,这样改才能真正控制电脑发热和风扇噪音
  • 对称性自适应机器学习力场:高效精准计算碳纳米管声子谱