旋轉陣列求最小值

2021-06-26 15:55:34 字數 1288 閱讀 6025

這是letcode上的一道題目 leetcode: find minimum in rotated sorted array

一、什麼是旋轉陣列呢,就是乙個有序的陣列,在從某乙個位置開始,旋轉到陣列的另一端,例如:0 1 2 3 4 5 6 -> 4 5 6 0 1 2 3

二、使用暴力的方式就是遍歷這個陣列,演算法的複雜度就是o(n),但是根據一般的經驗提到有序,就會考慮到使用二分將演算法的複雜度降低到o(logn),當然這個題目也不例外,但是如何利用二分去求解呢,畢竟不是全部有序。

首先我們先找到陣列的中點在慢慢的分析,設左右邊界和中點分別是left,right,mid,旋轉陣列有個特性也是必然,那就是中點分成的兩段陣列必然有一段是有序的,而另一端有可能還是旋轉陣列或是有序的陣列,例如4 5 6 0 1 2 3中點分開的兩邊都是有序陣列,3 4 5 6 1 2中點分開的左邊是有序的,右邊還是旋轉陣列。根據這個特性我們有以下的分析。

1、如何中點分開的陣列左邊有序a[left] <= a[mid]

(1)同時右邊也是有序的,a[mid] <= a[right],那麼a[left]就是最小值

(2)如果中點到右邊界是無序的 a[mid] > a[right],那麼left = mid -1去右邊尋找最小值

2、如果 a[left] > a[mid] 左端是無序的

(1)同時a[mid] < a[right] 那麼就需要繼續二分,但是不減1(因為mid有可能就是波谷)

(2)同時a[mid] > a[right] 這種情況不可能發生,因為這種情況會導致整體反序,與旋轉陣列不符

**如下:

#include int find_min(int* arr, int l, int h)

else

}else //右側有序 左側有可能有波谷

}return l;

}int main(int argc, char *argv)

; int a2 = ;

int a3 = ;

int a4 = ;

int a5 = ;

printf("%d\n", find_min(a1, 0, 5));

printf("%d\n", find_min(a2, 0, 5));

printf("%d\n", find_min(a3, 0, 1));

printf("%d\n", find_min(a4, 0, 0));

printf("%d\n", find_min(a5, 0, 2));

}

結果是:30

101

求旋轉陣列的最小值

思路 基本方法 從頭遍歷一遍,時間複雜度為o n 效率比較低,這裡採用二分查詢,找出中間元素與頭,尾比較,如果中間元素比頭元素大,說明這部分有序,最小值在後半部分,中間元素為頭 如果中間元素比尾元素大,說明最小值在前部分。設定兩個指標start和end分別指向陣列的首尾元素,然後當start指向前半...

求旋轉陣列後的最小值

乙個有序陣列,將前面的一段放在陣列的後面就被稱之為旋轉。比如 1,2,3,4,5,6 就可以旋轉為 5,6,1,2,3,4 輸入乙個旋轉後的陣列,輸出陣列中的最小值。直接遍歷的時間複雜度是o n 接下來介紹並實現乙個o log n 的演算法。以 50,10,20,30,40 為例 下標 first ...

Java求旋轉陣列的最小值

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。可以借助二分查詢法的思想。author 16026 public clas...