《劍指 Offer》 6 旋轉陣列的最小數字

2021-10-09 01:37:16 字數 1662 閱讀 8170

二分查詢

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

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

例如:

原陣列:

輸入旋轉陣列:

輸出旋轉陣列的最小元素:1

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

基本思路

將旋轉陣列對半分,可以得到乙個非遞減排序的陣列,以及乙個包含最小元素的新旋轉陣列。

將旋轉陣列再次對半分,又可以得到乙個非遞減排序的陣列,以及乙個包含最小元素的新旋轉陣列。此時,新旋轉陣列只剩兩個元素,最後乙個元素即最小元素。

新的旋轉陣列的陣列元素是原陣列的一半,從而將問題規模減少了一半,這種折半性質的演算法的時間複雜度為 o(logn)

**實現思路

上面基本的思路已經有了,但還有乙個關鍵問題,我們怎麼知道對半分後,哪個陣列是旋轉陣列,哪個陣列是非遞減排序的陣列?首先用兩個指標 low 和 high 分別指向陣列的第乙個元素和最後乙個元素,然後可以找到中間元素 mid。

此時 mid 指向的元素有兩種情況:

該元素大於等於 low 指向元素,說明最小元素在 mid 後面的陣列(包括 mid 指向的元素),於是將 low=mid。

該元素小於等於 high 指向元素,說明最小元素在 mid 前面的陣列(包括 mid 指向的元素),於是將 high=mid。

當 low+1=high 時,此時 high 指向的就是最小元素。

public

class

solution

int low =0;

int high = array.length -1;

int mid;

while

(true

)// 折半

mid =

(low + high)/2

;// mid 指向元素大於等於 low 指向元素,說明最小元素在 mid 後面的陣列(包括 mid 指向的元素),於是將 low=mid。

if(array[mid]

>= array[low]

)// mid 指向元素小於等於 high 指向元素,說明最小元素在 mid 前面的陣列(包括 mid 指向的元素),於是將 high=mid。

if(array[mid]

<= array[high])}

}}

劍指Offer 6 旋轉陣列的最小元素

description把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。可以直接binary search,每次mid和r的...

劍指offer(6) 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。這道題最直觀的解法並不難,從頭到尾遍歷陣列一次,我們就能找出最小的元素。這...

劍指Offer (6)旋轉陣列的最小數字

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。實現如下 l m r 規律 一般前旋轉區的數大於等於後旋轉區的...