153的进阶版本
题意:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
注意数组中可能存在重复的元素
思路 由于一个重复会影响 mid的判定会使得我们跳过最小值所在的区间
所以只能通过不断地减小边界试探 r的最小点 最坏情况和遍历几乎相同
还是得注意可能数组没有进行旋转
code:
class Solution:
def findMin(self, nums: List[int]) -> int:
l, r = 0, len(nums) - 1
while l < r:
mid = (l + r) // 2
if nums[mid] > nums[r]:
l = mid + 1
elif nums[mid] < nums[r]:
r = mid
else:
r -= 1
return nums[r]