【劍指offer】旋轉陣列的最小數字(二分)
阿新 • • 發佈:2018-12-22
題目描述
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所 有元素都大於0,若陣列大小為0,請返回0。解題思路
首先觀察這個陣列有什麼特點,它是由有序陣列旋轉而來的,如果有旋轉的話,那麼就存在一個下標 將有序陣列分為兩個有序陣列,使得 與 (n:陣列中數的個數) 這兩個區間是有序的,那麼我們就是要找到這個,然後輸出 就是答案。那麼怎麼找呢,我們考慮二分,旋轉之後的陣列滿足一個條件 ,初始值 ,那麼我們取中間值
如果滿足
如果滿足
當 的時候,我們就找到答案了,輸出
程式碼如下:
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];//如果沒有旋轉,即為有序陣列
}
};