旋轉陣列的最小值

2021-07-05 22:48:28 字數 1314 閱讀 8015

題目:把乙個陣列的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小值。例如陣列為的乙個旋轉,該陣列的最小值為1。

解析:(1)我們可以用順序查詢的方法找到陣列中的最小值,但是這個方法沒有用到旋轉陣列區域性有序的特點。

(2)和二分查詢法一樣,我們用兩個指標分別指向陣列的第乙個元素和最後乙個元素。按照題目中的旋轉規則,第乙個元素應該是大於或等於最後乙個元素的。接著我們可以找到陣列的中間元素。如果中間元素位於前面的遞增子陣列,那麼它應該大於或等於第乙個指標指向的元素。此時陣列中的最小元素應該位於該中間元素的後面。我們可以把第乙個指標指向該中間元素,這樣可以縮小尋找的範圍。移動之後的第乙個指標仍然位於前面的遞增子陣列中。同樣,如果中間元素位於後面的遞增子陣列中,那麼它應該小於或者等於第二個指標指向的元素。此時該陣列中最小的元素應該位於該中間元素的前面。我們可以把第二個指標指向該中間元素,這樣也可以縮小尋找的範圍。移動之後的第二個指標仍然位於後面的遞增子陣列之中。不管是移動第乙個指標還是移動第二個指標,查詢的範圍都會縮小到原先的一半。接下來我們再使用更新之後的兩個指標,重複做新一輪的查詢。第一指標總是指向前面遞增陣列的元素,而第二個指標總是指向後面遞增子陣列的元素。最終第乙個指標將指向前面子陣列的最後乙個元素,而第二個指標指向後面子陣列的第乙個元素。也就是他們最終會指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素,這就是迴圈結束的條件。

例如陣列,我們把第乙個指標指向第0個元素,把第二個指標指向第4個元素,位於兩個指標中間的數字是數字5,它大於第乙個指標指向的數字。因此中間數字5一定位於第乙個遞增子陣列中,並且最小的數字一定位於它的後面。#include#includeusing namespace std;

int minvalue(int arr,int length)

當中間元素的值和兩邊的元素值相等時,最小值在陣列的那一部分不確定,我們進行順序查詢

if(arr[midind] == arr[index1] && arr[midind] == arr[index2])

}return min;

} //當index1和index2指向的位置相鄰時,那麼index2指向的是最小值

if(index2 - index1 == 1)

midind = (index1 + index2) / 2;

if(arr[midind] >= arr[index1])//最小值位於midind之後

else if(arr[midind] <= arr[index2])//最小值位於midind之前

}return arr[midind];

}int main(void)

; int arr = ;

cout<

旋轉陣列的最小值

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 類似二分查詢,不斷縮小查詢範圍 int minnumberinro...

旋轉陣列的最小值

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 代表旋轉陣列的元素個數。...

旋轉陣列的最小值

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。class solution return rotatearra...