劍指Offer 7 旋轉陣列的最小數字

2021-10-04 06:27:23 字數 2197 閱讀 2260

題目描述

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

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

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

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

劍指offer思路:

我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的字陣列,而且前面的字陣列的元素大於或者等於後面字陣列的元素。我們還注意到最小的元素剛好是這兩個字陣列的分界線。在排序的陣列中可以用二分查詢實現o(logn)的查詢。本題給出的陣列在一定程度上是排序的,因此我們可以試著用二分查詢法的思路來尋找這個最小的元素。

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

接著我們可以找到陣列中間的元素。如果中間元素位於前面的遞增子陣列,那麼它應該大於或者等於第乙個指標指向的元素。此時最小元素應該位於該中間元素之後,然後我們把第乙個指標指向該中間元素,移動之後第乙個指標仍然位於前面的遞增子陣列中。

同樣,如果中間元素位於後面的遞增子陣列,那麼它應該小於或者等於第二個指標指向的元素。此時最小元素應該位於該中間元素之前,然後我們把第二個指標指向該中間元素,移動之後第二個指標仍然位於後面的遞增子陣列中。

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

示意圖如下:

特殊情況:

如果把排序陣列的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;}}

;

其實我也目前也沒很理解的透徹,我對這個思路的理解就像作者在書中所說的一樣就是利用二分查詢。一般情況,先比較頭尾兩個位置的數字大小,頭肯定大於尾,然後在利用中間位置的數字和尾部的數字比較,如果中間位置的數字比尾部數字大,則最小值肯定在它兩之間,反之,最小值就肯定在頭部跟中間之間,直至兩者下標差一,那麼最小的數字就找到了,當然還有圖二的那種特殊情況。

= =趕緊刷完劍指offer,去刷leetcode了!還有好多沒做,只能大概看下思路,自己想是不太可能了。

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

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。肯定不能直接遍歷,失去了這道題的意義 旋轉陣列其實是由兩個有序陣列拼接而成...

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

劍指offer 7.旋轉陣列的最小數字 題目 思路 二分查詢,因為陣列是兩節遞增的,可以通過二分找到邊界點 時間複雜度平均logn,最壞也是n 啟發或者坑 邊界條件的確定,需要debug,以及思維縝密。如果等於v的情況,應該取哪一部分區間 區間大小 1,0的時候,應該如何處理 class solut...

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

由旋轉陣列的定義可以知道,最小數字既要小於左邊的數又要小於右邊的數 另外因為陣列是非減排序的,所以陣列的原始狀態下一定是右邊的數大於中間的數大於左邊的數。利用二分查詢的思想,要想找到這個最小數說明順序陣列其中某個地方有個斷崖,所以旋轉陣列的最小數說明它是小於左邊的數的第乙個,也就是如果 rotate...