二分查詢
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如:
原陣列:
輸入旋轉陣列:
輸出旋轉陣列的最小元素: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 規律 一般前旋轉區的數大於等於後旋轉區的...