11.旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
分析:寻找旋转数组的最小数即寻找右侧排序的首元素。
方法:二分查找
1.取数组中间数,若中间的数大于等于数组第一个数,说明中间数位于前半个非递减数组中,因此最小值在数组的后半部分。
2.若中间数小于等于数组最后一个数,说明中间数位于后半个非递减数组中,因此最小值在数组的前半部分 。
3.当中间数等于左指针或者右指针时,即无法判断旋转点位置,则执行j=j-1缩小判断范围。
复杂度分析:
时间复杂度:O(log(2)N)
空间复杂度:O(1)
代码:
class Solution:
def minArray(self, numbers: [int]) -> int:
l,r = 0,len(numbers)-1
while l<r:
m = (l+r)//2
if numbers[m] > numbers[r]: r=m+1
elif numbers[m] < numbers[r]: r=m
else : r -= 1
return numbers[l]