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

2021-10-06 11:18:26 字數 1257 閱讀 1966

題目

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

輸入:[3,4,5,1,2]

輸出:1

思路

最簡單的方法就是從頭到尾遍歷陣列,然後找到最小的元素。這種方法的時間複雜度是o(n);

優化

反之,如果中間元素位於後面的遞增陣列,那麼他應該小於或等於第二個指標指向的元素。此時陣列中最小的元素應該位於中間元素的前面。可以將第二個指標指向該中間元素。

因為第乙個指標總是會指向前面遞增的子陣列元素第二個指標總是會指向後面遞增的子陣列元素。所以,最終兩個指標會相鄰,第二個指標指向的元素是最小元素

考慮特殊的情況

class

solution

的特例,此時第乙個元素是最小元素

while

(a[p1]

>= a[p2]

)

mid =

(p2 - p1)/2

+ p1;

if(a[p1]

== a[p2]

&& a[p2]

== a[mid]

)return

order

(a, p1, p2);if

(a[mid]

>= a[p1]

) p1 = mid;

else

if(a[mid]

<= a[p2]

) p2 = mid;

}return a[mid];}

static

intorder

(int

a,int p1,

int p2)

return res;

}}

二分法的另一種思路

class

solution

else

if(a[mid]

> a[p2]

)else

}return a[p1];}

}

複雜度分析

劍指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。分析 我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面子陣列的元素都大於或者等於後面子陣列的元素。和二分查詢...