劍指Offer_11_旋轉數組的最小數字
阿新 • • 發佈:2017-12-05
旋轉數組的最小數字 返回 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_旋轉數組的最小數字