把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為1。
note:給出的所有元素都大於0,若陣列大小為0,請返回0。
第一種方法:
從頭開始遍歷,當遇到不滿足非遞減排序規律的那個數時,那就是旋轉的邊界數,然後將其與最左端的數比較,得到最小的數
第二種方法:
二分法【貌似測試的時間和空間複雜度都更大】
使用三個指標,左指標,右指標,中間指標;
第乙個指標總是指向前面遞增陣列的元素,而第二個指標總是指向後面遞增陣列的元素。
最終第乙個指標將指向前面子陣列的最後乙個元素,而第二個指標會指向後面子陣列的第乙個元素。也就是它們最終會指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素。這就是迴圈結束的條件。
但是,當兩個指標指向的數字及它們中間的數字三者相同的時候,我們無法判斷中間的數字是位於前面的子陣列中還是後面的子陣列中,也就無法移動兩個指標來縮小查詢的範圍。此時,我們不得不採用順序查詢的方法。
1class
solution01
11};
1213
class
solution02
25 m = (l + r) / 2;26
if (rotatearray[m] == rotatearray[l] && rotatearray[m] ==rotatearray[r])
27return
getmin(rotatearray, l, r);
28else
if (rotatearray[m] >=rotatearray[l])
29 l =m;
30else
31 r =m;32}
33return
rotatearray[m];34}
3536
int getmin(vector num, int l, int
r)37
42 };
in the previous subarray. therefore,
劍指offer11 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。陣列可能包含重複項。注意 陣列內所含元素非負,若陣列大小為0,請返回 1。樣例 輸入 nums 2,2,2,0,1 輸出 0思路 首先判...
劍指Offer 11 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素,例如,陣列為的乙個旋轉,該陣列的最小值為1.思路 設定兩個指標。利用二分查詢法。第乙個指標指向第乙個元素,第二個指向最後乙個元素。找到陣列的中間元素,如果中間的元素大於第乙...
《劍指Offer》11 旋轉陣列的最小數字
牛客網 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。二分查詢 一定要先判斷h,如果先判斷l則不會通過,因為陣列是從左向右幾乎遞增的。判斷中間值大於l處時,最小值可能在右邊,也可能在左邊 例如 4,1,2,4,4,4,4...