劍指Offer 面試題8 旋轉陣列的最小數字

2021-07-25 06:11:23 字數 2834 閱讀 9903

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

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

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

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

class solution 

//全部資料旋轉,相當於沒有旋轉,最小數即為第乙個數

return rotatearray[0];

}};

核心**:第10行和第11行;旋轉之後的陣列由兩個遞增陣列構成,如果發現了在原陣列中a[i]>a[i+1],那麼久可以判定最小值為a[i+1]了;

但是上述**的時間複雜度為o(n),太慢,在面試的時候,如果給出上述實現,面試官必然不會滿意!

思路2:

1. 分別用兩個指標left,right指向陣列的第乙個元素和最後乙個元素;(按題目中的規則,第乙個元素應該是≥最後乙個元素的)

2. 找到陣列的中間元素center=(left+right)/2來取得;如果center位於前面的遞增子串行,那麼它應該≥left指向的元素;我們就可以將left移至center處,縮小尋找的範圍;如果center位於後面的遞增子串行,那麼它應該≤right指向的元素;我們就可以將right移至center處,縮小尋找的範圍;無論是移動哪乙個指標,都會縮小範圍,然後用更新之後的指標做新一輪的查詢;

3. 最終第乙個left指向前面子陣列的最後乙個元素,right指向後面子陣列的第乙個元素,也就是他們兩指向相鄰的兩個元素,二第二個指標指向的剛好就是最小的元素.這就是迴圈的出口;

貼**:

public

class solution

int length=array.length;//陣列的長度

int left=0;

int right=length-1;

int center=left;

while(array[left]>=array[right])

center=(left+right)/2;

if(array[center]>=array[left])else

if(array[center]<=array[right])

}return

array[center];

}}

注意:第乙個數字總是大於最後乙個數字,那麼迴圈的條件就可以設定為while(array[left]>=array[right]),但是有乙個特例,也就是當把排序陣列的前面0個元素搬到後面的時候,那麼旋轉陣列就等於原陣列,則此時上述條件是不成立的,所以應該直接return[0];這也就是為什麼int center=left;的原因(此時center==0)!

上訴**時間複雜度:o(logn);

萬事大吉啦? .. 別高興得太早…

考慮如下情況:

[1,0,1,1,1]和[1,1,1,0,1]都可以看做是陣列[0,1,1,1,1]的旋轉;

在第乙個旋轉陣列中,array[left]=1;array[right]=1;array[center]=1;

在第二個旋轉陣列中:也有

array[left]=1;array[right]=1;array[center]=1;

但是在第一種情況中,a[center]位於後面的子陣列中;在第二種情況中,a[center]位於前面的陣列中;

所以當array[left]==array[right]&&array[left]==array[center]&&array[right]==array[center]時,無法判斷a[center]是位於前面的陣列中還是後面的陣列中,故無法移動指標,進而無法縮小範圍.

當出現這種情況的時候,我們採用順序查詢來解決問題.

最終的**如下所示:

public

class solution

int length=array.length;//陣列的長度

int left=0;

int right=length-1;

int center=left;

while(array[left]>=array[right])

//當下標left,right,center三個位置處的數相等的時候,則只能順序查詢

if(array[left]==array[right]&&array[left]==array[center]&&array[right]==array[center])

center=(left+right)/2;

if(array[center]>=array[left])else

if(array[center]<=array[right])

}return

array[center];

}int mininorder(intarray,int left,int right)

}return result;

}}

劍指offer 面試題8 輸出旋轉陣列最小值

include using namespace std int min int arr,int len return arr q int main int m min arr,6 cout 這種 只能處理常規情況,如果陣列旋轉值為0,即陣列還是乙個遞增陣列,p q mid,陷入死迴圈。如果中間值跟兩...

劍指offer 面試題8 旋轉陣列的最小值

package chapter2 面試題8 旋轉陣列的最小值 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。public class 08 rotatearray int arr...

劍指offer 面試題8 旋轉陣列的最小數值

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