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

2021-10-03 19:41:17 字數 805 閱讀 6227

題目: 把乙個陣列最開始的若干個元素搬到陣列的末尾, 我們稱之陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉, 輸出旋轉陣列的最小元素。例如陣列的乙個旋轉,該陣列的最小值為1

通過分析這個旋轉陣列的特性我們可以發現,旋轉後的陣列實際上可以分為兩組子陣列,前者的所有元素均大於後者的所有元素。我們還可以注意到,我們要求的最小元素剛好就是這兩組子陣列的分界線。

所以這道題就是求這兩個子陣列之間的分界線。排序陣列我們就可以用二分法的思想進行搜尋,時間複雜度可以降為o(logn)

具體的步驟和二分法查詢大體相同,用兩個指標分別指向陣列的第乙個元素和最後乙個元素,然後檢視兩個指標正中間的元素,如果正中間這個元素大於第乙個指標的元素,那麼就將第乙個指標移到中間;否則如果正中間元素小於最後乙個指標的元素,則將最後乙個指標移到正中間,以此往復迴圈,直到兩個指標相鄰,那麼第二個指標就是最小的元素。

這道題需要考慮兩個特殊情況,乙個是這個旋轉陣列就是原陣列:[1,2,3,4,5],這個時候用上述方法就會發現中間的元素既大於指標1元素又小於指標2元素,所以出現了bug,這種情況直接返回陣列第一項就行。第二種情況是兩個指標指向的元素大小相同,這個時候中間的元素要麼同時大於兩個指標元素,要麼同時小於兩個指標元素,也出現了bug,這種情況只能按順序來搜尋,時間複雜度也免不了成為o(n),

**如下:

function

minnumberinrotatearray

(p)return min

}else

else

if(p[index2]

>= p[indexmid])}

}}

劍指offer 面試題11 旋轉陣列的最小數字

完整 位址 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。這道題目相對前面的比較複雜,坑比較多 此時用二分法解決,mi...

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

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

《劍指offer》面試題11 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列為的乙個旋轉,該陣列的最小值為1。分析 我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或者等於後面子陣列的元素。和二分查詢...