6 旋轉陣列的最小數字

2021-09-29 18:20:09 字數 1509 閱讀 5195

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

note:給出的所有元素都大於0,若陣列大小為0,請返回0。

將發現,旋轉之後的陣列實際上可以劃分為兩個排序的字陣列,而且前面的字陣列的元素大於或者等於後面字陣列的元素。 而且 最小的元素剛好是兩個子陣列的分界線。 已知這兩個子陣列均為有序陣列,大陣列在一定程度上有序,考慮用二分查詢,時間複雜度o(logn)。

可以發現,第乙個指標總是指向前面遞增陣列的元素,第二個指標總是指向後面遞增陣列的元素。最終它們會指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素,這就是迴圈結束的條件。

注意:特殊情況,如果把排序陣列的0個元素搬到最後面,這仍然是旋轉陣列,如果發現陣列中的乙個數字小於最後乙個數字,就可以直接返回第乙個數字了。

還有一種情況:

這種情況下, 第乙個指標指向的數字、第二個指標指向的數字和中間的數字三者相等,我們無法判斷中間的數字1是數以前面的遞增子陣列還是後面的遞增子陣列。這樣的話,我們只能進行順序查詢。

class

solution

int left =0;

//左指標

int right = size -1;

//右指標

int mid =0;

//中間指標

while

(rotatearray[left]

>= rotatearray[right]

) mid = left +

(right - left)/2

;//計算中間指標位置

//特殊情況:如果無法確定中間元素是屬於前面還是後面的遞增子陣列,只能順序查詢

if(rotatearray[left]

== rotatearray[right]

&& rotatearray[mid]

== rotatearray[left]

)//中間元素位於前面的遞增子陣列,此時最小元素位於中間元素的後面

if(rotatearray[mid]

>= rotatearray[left]

)//中間元素位於後面的遞增子陣列,此時最小元素位於中間元素的前面

else

}return rotatearray[mid];}

private

://順序尋找最小值

intmininorder

(vector<

int>

&num,

int left,

int right)

}return result;}}

;

6 旋轉陣列 的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。演算法 逐個遍歷,時間複雜度為o n 空間複雜度為o 1 class so...

6 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。解法1 開始沒有get到這個題目的點,個人感覺旋轉後,遍歷到第乙個...

6 旋轉陣列的最小數字

考察 查詢和排序 1 題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列 後面數大於或者等於前面的數 的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。2 思路1 陣列...