剑指Offer-数组-旋转数组的最小数字

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]

你可能感兴趣的:(数据结构)