找到旋转排序数组中的最小值
字数 1058 2025-10-27 17:17:02
找到旋转排序数组中的最小值
题目描述
假设一个按照升序排列的数组在某个未知的旋转点进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变成 [4,5,6,7,0,1,2]。请找出并返回这个数组中的最小元素。你可以假设数组中不存在重复元素。
解题过程
-
理解问题
题目中的数组原本是升序的,但经过一次旋转后,变成了两段有序的部分。例如,[4,5,6,7,0,1,2]由[4,5,6,7]和[0,1,2]两个有序段组成。最小值是第二个有序段的第一个元素(即旋转点)。 -
暴力解法(非最优)
直接遍历整个数组,记录遇到的最小值。时间复杂度是 O(n),但题目要求更高效的解法(通常暗示 O(log n))。 -
二分查找思路
由于数组局部有序,可以用二分查找快速缩小搜索范围:- 设左指针
left和右指针right,初始分别指向数组首尾。 - 计算中间位置
mid。 - 关键观察:如果
nums[mid] > nums[right],说明最小值在mid右侧(例如[4,5,6,7,0,1,2]中,mid指向7时,7 > 2,最小值在右侧);否则最小值在mid左侧或就是mid。 - 通过不断二分,最终
left和right会指向最小值。
- 设左指针
-
逐步推演示例
以nums = [4,5,6,7,0,1,2]为例:- 初始:
left=0,right=6,mid=3(值7)。
∵7 > 2∴ 最小值在右侧,令left = mid + 1 = 4。 - 当前:
left=4,right=6,mid=5(值1)。
∵1 < 2∴ 最小值在左侧或就是mid,令right = mid = 5。 - 当前:
left=4,right=5,mid=4(值0)。
∵0 < 1∴ 令right = mid = 4。 - 此时
left == right,最小值nums[4] = 0。
- 初始:
-
算法实现要点
- 循环条件:
left < right(相等时找到结果)。 - 每次比较
nums[mid]和nums[right],避免直接比较nums[left](因为旋转点可能在任何位置)。 - 无重复元素保证了比较的确定性。
- 循环条件:
-
复杂度分析
每次将搜索范围减半,时间复杂度 O(log n),空间复杂度 O(1)。