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

LeetCode 153. Find Minimum in Rotated Sorted Array 题解

LeetCode 153. Find Minimum in Rotated Sorted Array 题解

题目描述

已知一个长度为n的数组,预先按照升序排列,经由1n旋转后,得到输入数组。例如,原数组nums = [0,1,2,4,5,6,7]在变化后可能得到:

  • 若旋转4次,则可以得到[4,5,6,7,0,1,2]
  • 若旋转7次,则可以得到[0,1,2,4,5,6,7]

注意,数组[a[0], a[1], a[2], ..., a[n-1]]旋转一次的结果为数组[a[n-1], a[0], a[1], a[2], ..., a[n-2]]

给你一个元素值互不相同的数组nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的最小元素

示例 1:

输入:nums = [3,4,5,1,2] 输出:1 解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

示例 2:

输入:nums = [4,5,6,7,0,1,2] 输出:0 解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。

示例 3:

输入:nums = [11,13,15,17] 输出:11 解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。

解题思路

方法:二分查找

思路

  • 由于数组是旋转排序的,所以数组可以分为两部分,每部分都是升序的,且前一部分的所有元素都大于后一部分的所有元素。
  • 我们可以使用二分查找来快速定位最小元素。
  • 具体步骤:
    1. 初始化左指针left为 0,右指针right为数组长度减 1。
    2. left < right时,计算中间位置mid
    3. 比较nums[mid]nums[right]的大小:
      • 如果nums[mid] < nums[right],说明最小元素在左侧,将right设为mid
      • 如果nums[mid] > nums[right],说明最小元素在右侧,将left设为mid + 1
    4. left == right时,返回nums[left],此时left指向最小元素。

复杂度分析

  • 时间复杂度:O(log n),其中 n 是数组的长度。每次查找都会将查找区间减半。
  • 空间复杂度:O(1),只需要常数级的额外空间。

代码实现

方法:二分查找

class Solution: def findMin(self, nums: List[int]) -> int: # 初始化左指针和右指针 left = 0 right = len(nums) - 1 # 当左指针小于右指针时,继续查找 while left < right: # 计算中间位置 mid = left + (right - left) // 2 # 比较中间元素和右指针元素的大小 if nums[mid] < nums[right]: # 最小元素在左侧,将右指针移到中间位置 right = mid else: # 最小元素在右侧,将左指针移到中间位置的右边 left = mid + 1 # 当左指针等于右指针时,返回左指针指向的元素,此时左指针指向最小元素 return nums[left]

测试用例

测试用例 1:

输入:nums = [3,4,5,1,2]
输出:1

测试用例 2:

输入:nums = [4,5,6,7,0,1,2]
输出:0

测试用例 3:

输入:nums = [11,13,15,17]
输出:11

总结

本题是二分查找的经典变体问题,主要考察对二分查找算法的理解和应用。通过比较中间元素和右指针元素的大小,我们可以确定最小元素的位置在左侧还是右侧,从而缩小查找区间。

二分查找的核心思想是:使用两个指针分别指向查找区间的两端,计算中间位置,比较中间元素与目标值的大小,根据比较结果缩小查找区间,直到找到目标值或确定目标值不存在。

这种方法的时间复杂度为 O(log n),适用于大规模旋转排序数组的最小元素查找。掌握二分查找的原理,对于理解搜索算法和算法设计思想非常重要。

http://www.jsqmd.com/news/662682/

相关文章:

  • 2026年过炉载具:解读行业三大核心发展趋势 - 速递信息
  • HG-ha/MTools惊艳效果:AI批量生成PPT配图+自动排版+演讲备注生成实测
  • 别再瞎猜了!用Wireshark抓包实战,带你读懂USB设备请求的8个字节
  • 【实战派×学院派】90|系统可用性老是差,一有高峰就崩?
  • 【SITS2026智能代码生成权威指南】:20年架构师亲授5大避坑法则与3类高危场景实战应对
  • Nano-Banana Studio开源镜像:支持国产昇腾/寒武纪芯片的适配可行性分析
  • 实践指南:基于产生式规则的动物识别专家系统构建
  • 别再乱选WiFi信道了!手把手教你用Android源码看懂2.4G/5G/6G频段划分(附信道表)
  • 国产COD检测仪/氨氮检测仪/水质检测仪/在线水质监测仪十大品牌 2026权威排名与选购建议 - 品牌推荐大师
  • hot100 146.LRU缓存
  • 如何通过DXVK让Linux游戏性能提升40%:从Direct3D到Vulkan的完整迁移指南
  • 2026年|Turnitin AI率飙至80%险遭延毕?手把手教你用DeepSeek+言笔一键降低AI率至0%! - 降AI实验室
  • 修理牛棚 Barn Repair
  • STM32F1驱动DHT11温湿度传感器:从时序图到代码实现的保姆级避坑指南
  • 2026小程序开发公司全面解析:初创商家高性价比小程序选型宝典 - 企业数字化改造和转型
  • Java 云原生开发最佳实践 2027:构建高效可扩展的云应用
  • 臭氧的相关知识
  • 餐饮外卖小程序极速上线全攻略2026最新版!呱呱赞平台0代码开发 - 企业数字化改造和转型
  • 软件冲刺回顾管理化的过程改进反思
  • 相亲红娘婚介的小程序一键生成全攻略!呱呱赞平台快速开发 - 企业数字化改造和转型
  • A-B 数对:当数字玩起“捉迷藏”
  • IPXWrapper终极指南:让经典游戏在Win10/Win11重获联机能力
  • 2026小程序SaaS制作平台深度测评:工具对比与避坑指南 - 企业数字化改造和转型
  • 2026年3月优质的电缆桥架企业推荐,轻型节能模压瓦楞桥架/镀锌电缆桥架/槽式电缆桥架,电缆桥架厂商找哪家 - 品牌推荐师
  • Linux性能优化之系列
  • go: Adapter Pattern
  • Frenet与Cartesian坐标系互转实战:Python函数库封装与性能优化
  • 3个关键功能,让FanControl成为Windows风扇控制的终极解决方案
  • 2026小程序开发公司推荐哪家?大盘点+避坑大全 - 企业数字化改造和转型
  • 告别抽卡盲盒:3步掌握原神抽卡数据分析的艺术