劍指offer 旋轉陣列的最小數字

2021-09-22 05:48:23 字數 1417 閱讀 9663

題目描述

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。 例如陣列為的乙個旋轉,該陣列的最小值為1。 note:給出的所有元素都大於0,若陣列大小為0,請返回0。

思路:旋轉之後的陣列實際上可以劃分成兩個有序的子陣列:前面子陣列的大小都大於後面子陣列中的元素。

注意到實際上最小的元素就是兩個子陣列的分界線。本題目給出的陣列一定程度上是排序的。

難點:考慮相同元素的影響

方法一:從後向前查詢,最小元素的前乙個元素會比其大,以此來確定最小元素。

class

solution

return rotatearray[0]

;}};

方法二:用二分查詢法尋找這個最小的元素

(1)我們用兩個指標left,right分別指向陣列的第乙個元素和最後乙個元素。按照題目的旋轉的規則,第乙個元素應該是大於最後乙個元素的(沒有重複的元素)。

但是如果不是旋轉,第乙個元素肯定小於最後乙個元素。

(2)找到陣列的中間元素mid = (left + right) / 2

中間元素大於第乙個元素,則中間元素位於前面的遞增子陣列,此時最小元素位於中間元素的後面。我們可以讓第乙個指標left指向中間元素。移動之後,第乙個指標仍然位於前面的遞增陣列中。

中間元素小於第乙個元素,則中間元素位於後面的遞增子陣列,此時最小元素位於中間元素的前面。我們可以讓第二個指標right指向中間元素。移動之後,第二個指標仍然位於後面的遞增陣列中。

以此縮小尋找的範圍。

(3)按照以上思路,第乙個指標left總是指向前面遞增陣列的元素,第二個指標right總是指向後面遞增的陣列元素。最終第乙個指標將指向前面陣列的最後乙個元素,第二個指標指向後面陣列中的第乙個元素。也就是說他們將指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素,這就是迴圈的結束條件。

(4)到目前為止,以上方法很好的解決了沒有重複數字的情況,這一道題目新增上了這一要求,有了重複數字,就從當前left到right進行方法一的查詢。

class

solution

if(rotatearray[mid]

>= rotatearray[left]

) left = mid;

else

right = mid;

}return rotatearray[right];}

private

:int

minorder

(vector<

int> rotatearray,

int left,

int right)

return rotatearray[left];}

};

劍指offer 旋轉陣列的最小數

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...

劍指offer 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...

劍指offer 旋轉陣列的最小數字

記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...