旋轉陣列的最小數字

2021-07-22 09:54:42 字數 1305 閱讀 4342

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

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

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

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

注意問題:

首先可以逐個比較比較大小,當找到第乙個小於前面值的數即為最小值,但是這種時間複雜度為o(n);而使用類似二分查詢可以將時間複雜度降為o(logn)。

解題思路:

(1)我們用兩個指標left,right分別指向陣列的第乙個元素和最後乙個元素。

(2)找到陣列的中間元素。

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

移動之後,第乙個指標仍然位於前面的遞增陣列中。

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

移動之後,第二個指標仍然位於後面的遞增陣列中。

(3)按照以上思路,第乙個指標left總是指向前面遞增陣列的元素,第二個指標right總是指向後面遞增的陣列元素。

最終指標left將指向前面陣列的最後乙個元素,指標right指向後面陣列中的第乙個元素。

也就是說他們將指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素,這就是迴圈的結束條件。

(4)但是還要考慮未旋轉(依次嚴格遞增)和有重複數字的情況!

(5)未旋轉時則第乙個數肯定為最小值

(6)有重複數字時,我們看一組例子:{1,0,1,

1,1} 和 {

1,1,

1,0,1} 都可以看成是遞增排序陣列{0,1,1,1,1}的旋轉。

這種情況下我們無法繼續用(1)、(2)、(3)的解法,去解決這道題目。因為在這兩個陣列中,第乙個數字,最後乙個數字,中間數字都是1。第一種情況下,中間數字位於後面的子陣列,第二種情況,中間數字位於前面的子陣列。

因此當兩個指標指向的數字和中間數字相同的時候,我們無法確定中間數字1是屬於前面的子陣列(綠色表示)還是屬於後面的子陣列(紫色表示)。此時還是得退化為o(n)複雜度的演算法。

class solution

return rotatearray[right];

}private:

int minorder(vectorarr){

vector::iterator itor;

int min=arr[0];

for(itor=arr.begin();itor!=arr.end();itor++){

if(*itor

旋轉陣列最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...

旋轉陣列最小數字

旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...

旋轉陣列的最小數字

1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...