题目
思路
数列分为前后两部分有序数列,最小值在前后数列的交界处,采用二分查找方法不断逼近,不过要考虑非递减数列的重复数字情况
代码
int binarySearch(int[] arr,int front,int rear){
if(front+1 == rear || front == rear)
return arr[rear]<arr[front]?arr[rear]:arr[front];
int index = (front+rear)/2;
if(arr[front] == arr[index] && arr[rear] == arr[index]){//此时两边中间都一样,考虑到特殊情况,我们两边均遍历一次,进行最后的比较大小。
int find1 = binarySearch(arr,front,index);
int find2 = binarySearch(arr,index+1,rear);
return find1<find2?find1:find2;
}else if(arr[index] >= arr[front] && arr[index] > arr[rear]){
return binarySearch(arr,index,rear);
} else{
return binarySearch(arr,front,index);
}
}