題目描述
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為1。
陣列可能包含重複項。
注意:陣列內所含元素非負,若陣列大小為0,請返回-1。
樣例
輸入:nums=[2,2,2,0,1]
輸出:0
思路原陣列是有序遞增的,旋轉陣列是將原陣列前面部分(也就是陣列中值最小的那部分數)搬到陣列後面,那麼可以確定,最小的元素(假設為minx)前面的數都大於等於它後面的數,可以用二分,設區間[l, r],mid=(l+r)/2,我們要查詢的數是minx:
①若區間中間的數nums[mid]比區間最後乙個數nums[r]小,那說明minx在區間[l, mid]內,令r=mid繼續二分查詢;
②若nums[mid]>nums[r],minx在區間[mid+1, r]內,令l=mid+1繼續二分查詢;
需要特別注意的是 當nums[mid]=nums[r]的情況,因為陣列可能包含重複項,那麼就不能確定minx到底在哪個區間了,為了能夠正確判斷,我們應該在查詢之前進行如下操作——
將陣列末尾等於nums[0]的數都剔除,這樣一來,minx前面的數就都大於它後面的數了,若nums[mid]=nums[r],那麼說明minx在區間[l, mid]內,即歸類於情況①,令r=mid繼續二分查詢.
當l=r時,這個數就是我們要找的最小元素了.
1之前以為二分的前提是數列有序,單調遞增或單調遞減,碰到這題之後發現自己想到的還是二分(雖然旋轉陣列並不是完全有序的),打破了原來的固有認知,有點懵,看到y神的解釋之後才想通——class
solution
14return
nums[l];15}
16 };
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列的最小數字
1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...