zoukankan      html  css  js  c++  java
  • 剑指Offer_11_旋转数组的最小数字

    题目描述

      把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出一个旋转数组的最小元素。

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

      分析:

      方法一:

        因为数组的原数组是一个递增数组,所以从头遍历数组,出现 a[i] 小于 a[i-1] 则说明找到了最小元素,为 a[i]。  

    1 int FindMinNumber(int arr[],int length){   // arr为旋转数组,length为数组长度
    2     for(int i=1;i<length;i++){
    3         if(arr[i]<arr[i-1])
    4             return arr[i] ;  // 找到了最小元素
    5     }
    6     return -1 ;  // 未找到,返回 -1 
    7 }

        方法二:

                 采用二分查找,两个指针分别指向旋转数组的首元素(p1)和尾元素(p2) ,比较两指针中间元素(midNum)与两端元素的大小。

         如果 p1 大于 midNum 则说明 p1到midNum之间的元素没有移动过,最小元素在另一半,p1指向midNum 。

         如果 p1 小于 midNum 则说明 p1到midNum之间的元素发生了改变,最小元素在其中, p2指向midNum 。

         p2同理。

         直至最后p1等于p2,则找到最小元素。 

     1 int FindMinNumber2(int arr[],int length){
     2     int p1 = 0 ;
     3     int p2 = length-1 ;
     4     int mid = (p1+p2)/2 ;
     5     while(p1!=p2){
     6         if(arr[p1]>arr[mid])
     7         {
     8             p2 = mid  ;
     9         }
    10         if(arr[p2]<arr[mid]){
    11             p1 = mid ;
    12         }
    13     }
    14     return arr[p1] ;
    15 }

        

     

  • 相关阅读:
    [CERC2015]Digit Division
    [SDOI2012]拯救小云公主
    [不知道出自什么OJ]最大利润
    [USACO08FEB]修路Making the Grade
    P1985 [USACO07OPEN]翻转棋
    P1156 垃圾陷阱
    奶酪
    扫描线
    php数组
    php switch
  • 原文地址:https://www.cnblogs.com/LexMoon/p/Offer_11.html
Copyright © 2011-2022 走看看