1. 程式人生 > >【劍指offer】旋轉陣列的最小數字(二分)

【劍指offer】旋轉陣列的最小數字(二分)

題目描述

把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所 有元素都大於0,若陣列大小為0,請返回0。

解題思路

首先觀察這個陣列有什麼特點,它是由有序陣列旋轉而來的,如果有旋轉的話,那麼就存在一個下標 i(i>=1)i(i>=1)將有序陣列分為兩個有序陣列,使得 [0,i1][0,i-1][i,n1][i,n-1] (n:陣列中數的個數) 這兩個區間是有序的,那麼我們就是要找到這個i

i,然後輸出 aia_i 就是答案。那麼怎麼找呢,我們考慮二分,旋轉之後的陣列滿足一個條件 alara_l\ge a_r,初始值 l=0,r=n1l=0, r=n-1,那麼我們取中間值 m=l+r2m=\frac{ l+r }2
如果滿足 amall=m;a_m \ge a_l那麼 l=m;
如果滿足 amarr=m;a_m \le a_r那麼 r=m;
rl=1r-l=1 的時候,我們就找到答案了,輸出 ara_r

程式碼如下:

class Solution
{ public: int minNumberInRotateArray(vector<int> a) { int l = 0, r = a.size()-1; while(a[l] >= a[r]) { if(r-l == 1) return a[r]; //結束條件,即找到所在下標i int m = (l+r)/2; if(a[m] >= a[l]) l=m; if(a[m] <= a[r]) r=m; } return
a[0];//如果沒有旋轉,即為有序陣列 } };