22 旋轉陣列的最小數字

2022-06-05 05:30:10 字數 1061 閱讀 2829

題目描述

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

輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為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

class

solution

14return

nums[l];15}

16 };

之前以為二分的前提是數列有序,單調遞增或單調遞減,碰到這題之後發現自己想到的還是二分(雖然旋轉陣列並不是完全有序的),打破了原來的固有認知,有點懵,看到y神的解釋之後才想通——

旋轉陣列最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為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.分析 首先我們可以看到原陣列為遞增排序的,並且以...