旋转数组的最小数字(改造二分法):
输入:一个递增排序的数组的一个旋转;
输出:旋转数组的最小元素。
#include<iostream>
using namespace std;
int searchMin(int arr[],int length){
int begin=0;
int end=length-1;
int initMid=(end-begin)>>1;
//if(arr[begin]<arr[end]) return arr[begin];
if(arr[begin]==arr[initMid]&&arr[initMid]==arr[end]){ //以防情况:1,0,1,1,1
int ans=arr[begin];
for(int i=1;i<length;i++){
ans=min(ans,arr[i]);
}
return ans;
}
else{
//begin和end指向相邻元素,退出
while(begin+1<end){
int mid=begin+((end-begin)>>1);
//要么左侧有序,要么右侧有序
if(arr[mid]>=arr[begin]){ //左侧有序
begin=mid;
}
else{
end=mid;
}
}
return arr[end];
}
}
int main(){
int array[]={1,0,1,1,1 };
cout<<searchMin(array,5)<<endl;
int array1[]={4,5,1,2,3};
cout<<searchMin(array1,5);
return 0;
}