# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
'''
if len(rotateArray)==0:
return 0
if len(rotateArray)==1:
return rotateArray[0]
for i in range(1,len(rotateArray)):
if rotateArray[i]<rotateArray[i-1]:
return rotateArray[i]
return rotateArray[0]
'''
#二分查找
r=rotateArray
if len(r)==0:
return 0
low=0
high=len(r)-1
while low<high:
mid=(high+low)/2
if r[mid]<r[high]:
high=mid
elif r[mid]>r[high]:
low=mid+1
else:
high=high-1
return r[low]
排序数组翻转后仍是部分排序的数组,可以用二分查找法
1. r[mid]<r[high] 中间值在左区间,但是r[mid]可能就是最小值,所以high=mid
2.r[mid]>r[high] 中间值在右区间,既然r[mid]已经大于r[high],那么r[mid]不会是最小值,所以low=mid+1
3. 此题还有一种情况,r[mid]=r[high]时的特例,即存在重复数字的情况
ori=[0,1,1,1,1],l1=[1,1,1,0,1] l2=[1,0,1,1,1],此时不能确定最小值0在左半部分还是右半部分,因为r[low]=r[high],所以只能遍历数组