153. 寻找旋转排序数组中的最小值
题目
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 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) 的算法解决此问题。
来源:力扣(LeetCode)链接
思路
看到有序数组,依旧是二分查找的思路。
- 左边界left,右边界right,中间节点mid。
- nums[mid] < nums[right] => 说明最小值可能就是mid或者在mid左侧。所以右边界设置为mid。
- nums[mid] > nums[right] => 说明最小值一定在右侧,随意直接把左边界设置到mid + 1。
- nums[mid] == nums[right] => left == right == mid。 这时候其实已经找到最小值了。
- back step 1
代码
class Solution:
def findMin(self, nums: List[int]) -> int:
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] < nums[right]:
right = mid
else:
left = mid + 1
return nums[right]
复杂度分析
时间复杂度: O(logn)
空间复杂度: O(1)