153. Find Minimum in Rotated Sorted Array(题目链接)
Medium
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7]
might become [4,5,6,7,0,1,2]
).
Find the minimum element.
You may assume no duplicate exists in the array.
Example 1:
Input: [3,4,5,1,2] Output: 1
Example 2:
Input: [4,5,6,7,0,1,2] Output: 0
方法1:
当nums[mid] <= nums[l], [mid, r]是有序序列,可以直接进行二分, 找出最小的数
当nums[mid] > nums[l], [l, mid] 是有序序列,可以直接尽心二分, 找出最小的数
基本思路就是每次我们找有序序列,然后进行二分,知道找完所有的有序序列为止,最后比较出最小的那个数
class Solution:
def findMin(self, nums: List[int]) -> int:
l, r = 0, len(nums) - 1
rlt = nums[0]
while l <= r:
mid = (l + r) // 2
if nums[l] <= nums[mid]:
rlt = min(rlt, nums[l])
l = mid + 1
else:
rlt = min(rlt, nums[mid])
r = mid - 1
return rlt
方法2:
当nums[mid] > nums[r]时,最小值一定存在于[mid + 1, r] 这个区间里。比如[4, 5, 6, 7, 1, 2, 3],nums[mid] = 7, 7 > 3, 最小的数1存在于[4, 6](这是nums的索引)
当nums[mid] < nums[r]时,最小值一定存在于[l, mid] 这个区间里。 比如[4, 5, 1, 2, 3], nums[mid] = 1, 1 < 3, 最小的数在区间 [2, 4]之间
class Solution:
def findMin(self, nums: List[int]) -> int:
l, r = 0, len(nums) - 1
while l < r:
m = (l + r) // 2
if nums[m] > nums[r]:
l = m + 1
else:
r = m
return nums[l]