把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。
遍歷陣列的每乙個元素,如果發現有比最小值小的,就把那個值賦給它即可。時間複雜度顯然是o(n)
class solution
int min = rotatearray[0]
;for
(auto i : rotatearray)
return min;}}
;
常規方法沒有利用題目所給的輸入陣列的特性。下面分析二分法
由題意可以知道,旋轉之後的陣列有下面的特點:
① 可以分為兩個已經排好序的子陣列。
② 前面的子陣列的元素均大於後面的子陣列的元素。
③ 最小的元素是這兩個子陣列的分界。
這時候,就可以利用兩個哨兵指標,分別指向陣列的第乙個元素和最後乙個元素
這時候,取中間的元素,
如果中間的元素位於前面的子陣列,那麼該中間元素肯定
大於等於第乙個元素(這作為改變指標的條件),並且要找的最小值肯定在中間元素的右邊。
於是令 left 指向中間元素。
如果中間的元素位於後面的子陣列,那麼該中間元素肯定
小於等於最後乙個元素(這作為改變指標的條件),並且要找的最小值肯定在中間元素的左邊。
於是令 right指向中間元素。
這樣不斷地進行比較,這樣,
哨兵left將會指向前面子陣列的最後乙個元素,
哨兵right將會指向後面子陣列的第乙個元素。
即他們最終的差值是1。這作為迴圈終止的條件
而哨兵right指向的就是最小的元素。
class solution
int left =0;
int right = rotatearray.
size()
-1;int mid =-1
;// 若滿足條件,則說明已經是非遞減序列,直接返回第乙個元素
if(rotatearray.
at(left)
< rotatearray.
at(right)
)while
(left < right)
int mid =
(left + right)/2
;if(rotatearray.
at(mid)
>= rotatearray.
at(left))if
(rotatearray.
at(mid)
<= rotatearray.
at(right))}
return rotatearray.
at(mid);}
};
刷題 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,且前面的子陣列的元素都大...
刷題筆記 旋轉陣列的最小數字(C )
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0 答 將原本是乙個有序陣列一分為二,分成兩個有序陣列,並調換位置。例如 答...
牛客刷題 找旋轉陣列的最小元素
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。解題思路 1 遍歷一遍陣列,只要遇到後乙個比前乙個小,那麼後乙個 就是最小...