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

#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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值