AcWing 22 旋轉陣列的最小數字

2021-09-11 20:14:16 字數 1867 閱讀 8870

題目描述:

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。陣列可能包含重複項。

注意:陣列內所含元素非負,若陣列大小為0,請返回-1。

樣例輸入:nums=[2,2,2,0,1]

輸出:0

分析:對這題的第一眼印象是單峰向量的類似題。

單峰向量(2018thu cs研究生初試ds第一道演算法題):向量a[0,n]中,a[0,k]單調遞增,a[k,n]單調遞減,要求在對數的時間複雜度內找出k。比如1 2 3 4 5 6 5 4 3,k = 6。

該題是可以直接二分解決的,由於嚴格單調,不存在重複元素,二分方法找到一點大於其左右邊元素即是所求。

對本題而言,與單峰向量相比,如果是沒有重複元素的乙個遞增陣列前k位反置到了末尾,比如456321,就是特殊的單峰向量題了,k=6左邊的值一律大於右邊的值,當然這一性質並不影響我們按照之前同樣的方法來解決。

再比如,乙個沒有重複元素的遞增陣列前k為平移到末尾,比如456123,同樣還是可以這樣二分,找到一點小於左右兩邊的兩個元素,這點就是最小點。對於本題而言,存在重複元素這一要求成功的讓我們不能通過將元素與左右元素比較進行二分的方法找到最小值,比如456122223,mid跳到2的位置我們無法確定往左還是往右繼續二分。

所以說,本題一方面剝奪了單峰向量沒有重複元素的性質,另一方面又賜予了min的右邊比min大但都比min的左邊小這一性質。我們可以比較mid與最左邊元素值的大小來確定二分方向,比如2<4,那麼2右邊肯定不比2小,繼續往左二分,直到遇見1,1和2都比4小,那麼哪個為最小值呢?往左二分,2的左邊比4小的元素肯定不會比2大,以此確定正確答案為1.

比較麻煩的情況是類似於1114560111這種,nums[mid]等於左邊的1的時候要往右二分,等於右邊的1的時候要往左二分,二分失效。所以我們先對這種情況去重,將末尾的元素如果與首元素相同,末尾指標一律前移,1111456111,前移到6,6大於1,所以首元素就是最小元素,111456011,前移到0,繼續二分操作。

這裡的二分操作注意,456123,只要nums[mid]比4小,r就會不停前移直到l == r為止。

格外注意這裡二分l,r都要取到端點值,如果[l,r)這樣二分會怎樣?比如題目樣例nums=[2,2,2,0,1],初始l=0,r = 5,mid=2,nums[2] = 2,l = mid+1 = 3,mid = 4,nums[4] = 1 < 2,r = mid +1 = 5,然後就出現r不前移,死迴圈了。

如果題目改為有重複元素的乙個遞增陣列前k位反置到了末尾,求最大的k,比如4566633321,我們依然可以按照本題思路與最左邊元素比較的思想來二分,遇見3小於4,則往左二分,遇見6大於4則往右二分。

總結一下二分查詢:

1.最開始就是在有序的陣列中找x,對陣列下標進行二分,此時key=x,不斷的將a[mid]與key比較即可。還有直接對陣列元素值進行二分查詢的,比如acwing 14 不修改陣列找出重複的數字。

2.也有key值不定的,比如單峰向量與mid左右的數比較,或者自己選定確定的key的,比如本題陣列首元素為key。所以使用二分時要注意是對下標還是值進行二分,key的值是什麼?

3.二分與三分,取決於是否要將等號單獨判斷,另外二分時會導致判斷樹向一邊傾斜,從而導致複雜度偏高,於是產生了斐波那契查詢。

4.二分迴圈的判斷,迴圈結束條件是l > r還是l == r還是l + 1 == r ?

5.二分時,l,r取mid還是mid+1,mid-1;二分區間是左閉右開,還是左右都是閉區間。

以上各點的搭配必須精確,否則會導致死迴圈或者查詢結果的不正確。

class solution 

return nums[r];

}};

AcWing 22 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。陣列可能包含重複項。注意 陣列內所含元素非負,若陣列大小為0,請返回 1。輸入 nums 2,2,2,0,1 輸出 0 python3 ...

22 旋轉陣列的最小數字

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。陣列可能包含重複項。注意 陣列內所含元素非負,若陣列大小為0,請返回 1。樣例輸入 nums 2,2,2,0,1 輸出 0 思...

旋轉陣列最小

題外話 剛開始我看到題目的時候,腦子一直在想,直接遍歷陣列,這樣最小的不就能找到最小的麼,不過去網上搜尋了一下後,發現這確實是乙個解決的辦法,但時間複雜度為o n 這樣的答案達不到面試官的要求,所以大家做這種面試題的時候,要轉換思路,在解決問題的同時,盡量給出最優解 好了,分析題目,可以知道得出結論...