旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
输入
[3,4,5,1,2]
返回值
1
解题思路
几种情况:
- 【1,0,1,1,1】
- 【1,1,1,0,1】
if rotateArray[mid] == rotateArray[start] and rotateArray[mid] == rotateArray[end]:
#特殊情况,如:【1,0,1,1,1】,采用顺序查找
...
- 【1,2,3,4,5】
while start < end and rotateArray[start] >= rotateArray[end]:
...
if rotateArray[start] < rotateArray[end]:
return rotateArray[start]
- 【9,10,1,2,3,4,5】
- 【9,10,11,5,6】

def minNumberInRotateArray(self, rotateArray):
if not rotateArray:
return 0
start = 0
end = len(rotateArray) -1
if end == 0:
return rotateArray[0]
#最小值存放在end中
while start < end and rotateArray[start] >= rotateArray[end]:
if end -start == 1:
break
mid = (start + end) // 2
if rotateArray[mid] == rotateArray[start] and rotateArray[mid] == rotateArray[end]:
#特殊情况,如:【1,0,1,1,1】,采用顺序查找
tmp = rotateArray[start]
for i in range (start,end+1):
if tmp > rotateArray[i]:
tmp = rotateArray[i]
return tmp
if rotateArray[start] <= rotateArray[mid]:
#mid还在第一个有序列表中
start = mid
if rotateArray[end] >= rotateArray[mid]:
#最小值为mid或mid前面的值
end = mid
if rotateArray[start] < rotateArray[end]:
return rotateArray[start]
return rotateArray[end]