LeetCode | 寻找旋转排序数组中的最小值

515 字
3 分钟
LeetCode | 寻找旋转排序数组中的最小值

分类:二分查找 / 数组

题目#

已知一个长度为 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 ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的最小元素。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例:

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

讲解#

这题和 搜索旋转排序数组 很像,都是在旋转后的升序数组里做二分。

区别是:33 要找 target 的位置,这题只要找最小值。

最小值一定在旋转断点那里。比如 [4,5,6,7,0,1,2] 里,0 就是断点后的第一个数。

判断方向时,可以比较 nums[mid]nums[right]

如果 nums[mid] > nums[right],说明 mid 在左边较大的那段里,最小值一定在 mid 右边,所以 left = mid + 1

如果 nums[mid] <= nums[right],说明从 midright 这一段是有序的,最小值可能就是 mid,也可能在 mid 左边,所以 right = mid

循环结束时,left == right,这个位置就是最小值的位置。

复杂度#

  • 暴力做法:
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
  • 二分查找:
    • 时间复杂度:O(log(n))
    • 空间复杂度:O(1)

代码#

源码#

from typing import List
class Solution:
def findMin(self, nums: List[int]) -> int:
left = 0
right = len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] > nums[right]:
left = mid + 1
else:
right = mid
return nums[left]

测试#

from src.python._153_Find_Minimum_in_Rotated_Sorted_Array import Solution
sol = Solution()
assert sol.findMin([3, 4, 5, 1, 2]) == 1
assert sol.findMin([4, 5, 6, 7, 0, 1, 2]) == 0
assert sol.findMin([11, 13, 15, 17]) == 11
assert sol.findMin([1]) == 1
print("PASS")

参考资料#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

LeetCode | 寻找旋转排序数组中的最小值
https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/
作者
平昊阳
发布于
2026-08-08
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
平昊阳
乘长风,破巨浪, 展鸿图于未央!
--
总访问量
--
访客数
公告
欢迎来到我的个人博客!欢迎关注交流吖!
更多相关公告,见
社交-留言」。
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
文章
66
分类
16
标签
93
总字数
477,284
运行时长
0
最后活动
0 天前

文章目录