1. 程式人生 > >劍指Offer_11_旋轉數組的最小數字

劍指Offer_11_旋轉數組的最小數字

旋轉數組的最小數字 返回 ffffff ber urn 指向 size fin subject

題目描述

  把一個數組最開始的若幹個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出一個旋轉數組的最小元素。

  例如: {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 }

    

劍指Offer_11_旋轉數組的最小數字