剑指offer刷题之c++实现的旋转数组的最小数字

来源:互联网 发布:饮冰室文集 知乎 编辑:程序博客网 时间:2024/05/19 20:19
#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;    }

0 0
原创粉丝点击