154. Find Minimum in Rotated Sorted Array II
旋转数组它又来了
题干:
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.
The array may contain duplicates.
解释:
一个有序数组被旋转了,让找最小值,关键点是有重复
思考:
本质是考二分查找。如果没有重复,直接二分查找到最后收缩的位置就是最小值了,那么重复有啥影响呢?这里我们暂时想不到,所以我们先写一个不考虑重复的版本,看看有什么corner test.结果发现其实这个题关键是在如果mid和right是相等的时候,要right-1继续寻找,因为破坏了二分的条件,最后返回的是left。时间效率85
答案:
class Solution(object):
def findMin(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left,right=0,len(nums)-1
while left<right:
mid = left+(right-left)//2
if nums[mid]>nums[right]:
left = mid+1
elif nums[mid]<nums[right]:
right=mid
else:
right-=1
return nums[left]