思路:
方法一:暴力解法
遍历整个数组找到小值,但是没有利用到排序数组的特点;复杂度o(n)
方法二:二分法
以上图为例首先用两个指针p1,p2分别指向数组的首尾端,首先找到中间元素5,因为5大于p1指向的元素,所以中间元素5肯定位于第一个递增子数组中,并且最小的元素一定在它后面,所以把指针p1指向中间元素,在此找到中间元素(1),因为1小于5,而且也小于p2指向的元素,所以1一定位于第二个递增子数组中,并且最小元素一定在它前面或者就是它本身。
需要考虑的问题:(1)起始元素=尾部元素=中间元素的(2)元素有序。
public int minNumberInRotateArray(int [] array){
if(array==null||length<0)
return -1;
int left=0;
int right=array.length-1;
int mid=0;
while(array[right]<array[left]){
//array[right]>array[left],则为有序
if(right-left==1){
mid=right;//只有两个元素
break;
}
mid=(left+right)/2;
if(array[left]==array[right]&&array[left]==array[mid])
return MinOrder[array,left,right];
if(array[left]<=array[mid])
left=mid;
else if(array[right]>=array[mid])
right=mid;
}
return array[mid];
}
int MinInOrder(int [] array,int left,int right){
int result=0;
for(int i=left;i<= right;i++){
if(result>array[i])
result=array[i];
}
return result;
}