刷題筆記6 輸出旋轉陣列的最小元素

2021-09-30 16:42:27 字數 1723 閱讀 1096

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為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 遍歷一遍陣列,只要遇到後乙個比前乙個小,那麼後乙個 就是最小...