题目描述:把一个数组最开始的若干个元素移动到数组的末尾,称之为一个数组的旋转。输入一个递增排序的数组的旋转,输出旋转数组的最小元素。


例如:数组 {3,4,5,1,2} 为{1,2,3,4,5} 的一个旋转,该数组的最小元素为 1。

分析:


intMin(int*numbers,intlength){if(numbers==NULL||length<=0)thrownewstd::exception("Invalidparameters");intindex1=0;intindex2=length-1;intindexMid=index1;while(numbers[index1]>=numbers[index2]){//如果index1和index2指向相邻的两个数,//则index1指向第一个递增子数组的最后一个数字,//index2指向第二个子数组的第一个数字,也就是数组中的最小数字if(index2-index1==1){indexMid=index2;break;}//如果下标为index1、index2和indexMid指向的三个数字相等,//则只能顺序查找indexMid=(index1+index2)/2;//缩小查找范围if(numbers[indexMid]>=numbers[index1])index1=indexMid;elseif(numbers[indexMid]<=numbers[index2])index2=indexMid;}returnnumbers[indexMid];}

intMin(int*numbers,intlength){if(numbers==NULL||length<=0)thrownewstd::exception("Invalidparameters");intindex1=0;intindex2=length-1;intindexMid=index1;while(numbers[index1]>=numbers[index2]){//如果index1和index2指向相邻的两个数,//则index1指向第一个递增子数组的最后一个数字,//index2指向第二个子数组的第一个数字,也就是数组中的最小数字if(index2-index1==1){indexMid=index2;break;}//如果下标为index1、index2和indexMid指向的三个数字相等,//则只能顺序查找indexMid=(index1+index2)/2;if(numbers[index1]==numbers[index2]&&numbers[indexMid]==numbers[index1])returnMinInOrder(numbers,index1,index2);//缩小查找范围if(numbers[indexMid]>=numbers[index1])index1=indexMid;elseif(numbers[indexMid]<=numbers[index2])index2=indexMid;}returnnumbers[indexMid];}intMinInOrder(int*numbers,intindex1,intindex2){intresult=numbers[index1];for(inti=index1+1;i<=index2;++i){if(result>numbers[i])result=numbers[i];}returnresult;}