2.10 解题实战:旋转数组的最小数字(改造二分法)

2019-03-22  本文已影响0人  Aurochsy

Chapter2: 时间复杂度分析、递归、查找与排序

10. 解题实战:旋转数组中的最小数字(改造二分法)

题目

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1

算法

显然要利用题目的有序性来提升算法性能,自然而然地就想到二分法

原理

观察反转数组特点:{3,4,5,1,2}、{4,5,1,2,3}、{5,6,1,2,3,4}等,将其一分为二,发现

代码实现

代码

/*找反转数组中最小的数
反转数组:将递增数组前面的一部分数保持顺序放到数组尾部
如{3,4,5,1,2} 、{4,5,1,2,3} 
*/
int min(int* arr,int arrLen){
   int begin=0;
   int end=arrLen-1;
   while(begin+1<end){
       int mid=begin+((end-begin)>>1);//等价于(begin+end)/2,更高效 
       //要么数组的左侧有序,要么右侧有序
       if(arr[mid]>=arr[begin]){//左侧有序 
           begin=mid; 
       } else{
           end=mid;
       }
   }
   return arr[end];
}
上一篇 下一篇

猜你喜欢

热点阅读