#include "myHead.h"
/*
输入一个递增排序数组的一个旋转。其中旋转指将一个数组的最开始的几个元素搬到数组的末尾。
求这个数组的最小值。
仿照二分查找。设两个指针,指向头和尾。设mid为中间那个位置。那么中间那个位置将确定最小的数在左边还是右边。
一旦头尾指针相差为1,则尾指针指向的数就是最小的。返回。否则:
如果中间那个数和头指针比较,大于等于头指针,那么最小数肯定在右边一拨,将数组范围缩小,只需要将头指针改到这个mid就行
如果中间那个数和尾指针比较,小于等于尾指针,那么最小数肯定在左边一拨,将数组范围缩小,只需要将尾指针改为mid.
*/
int MinInOrder(vector<int> a,int l,int h);
int minNumberInRotateArray(vector<int> rotateArray) {
if(rotateArray.size() ==0)
return 0;
int low,high,mid;
low = 0;
high = rotateArray.size()-1;
mid = low;//如果把原来排序的数组第0个元素搬到最后面,那么不必计算。第一个元素就是最小值。故mid初始化为low
cout<<"out:"<<low<<high;
while(rotateArray[low] >= rotateArray[high]){//至少搬了1个元素到最后面
mid = (low+high)/2;
if(high -low ==1){
mid = high;
break;
}
//这个if判断必须放到前面,否则在下面的话low high 会有改变。
//mid、low、high对应的位置数相等。很难搞。那么只好粗暴的从头开始比较
if((rotateArray[mid] ==rotateArray[low] )&&(rotateArray[mid]==rotateArray[high]) ){
cout<<"now:"<<low<<high;
return MinInOrder(rotateArray,low,high);
}
if((rotateArray[mid] <=rotateArray[high] )){
cout<<endl<<"in if:"<<low<<high<<mid;
high = mid;
}
else if((rotateArray[mid] >=rotateArray[low] ) ){
cout<<endl<<"in else : "<<low<<high<<mid;
low = mid;
}
cout<<endl<<"in:"<<low<<high<<mid;
}
return rotateArray[mid];
}
int MinInOrder(vector<int> a,int l,int h){
cout<<"hh l:"<<l<<"h:"<<h<<endl;
int min = a[l];
while(l<=h){
cout<<"min-"<<min<<"a[l]-"<<a[l];
if(min>a[l]){
min = a[l];
cout<<min;
}
l++;
}
cout<<"h"<<min;
return min;
}
int main(){
vector<int> v;
// v.push_back(1);
// v.push_back(0);
// v.push_back(1);
// v.push_back(1);
// v.push_back(1);
// v.push_back(3);
// v.push_back(4);
// v.push_back(5);
// v.push_back(1);
// v.push_back(2);
v.push_back(2);
v.push_back(2);
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(2);
for(vector<int>::iterator it=v.begin();it<v.end();++it){
cout<<*it<<" ";
}
cout<<endl<<minNumberInRotateArray(v);
return 1;
}
剑指offer刷题之c++实现的旋转数组的最小数字
最新推荐文章于 2023-03-16 14:10:36 发布