旋轉陣列的最小數

2021-09-25 09:17:02 字數 1725 閱讀 8701

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

這是一道二分查詢的變形題目

1.旋轉之後的其實可以劃分為兩個有序的子陣列:前面的陣列的大小都應該大於後面陣列中的元素;注意,陣列中最下的元素應該是兩個子陣列的分界線。本題目給出的陣列在一定程度上是排序的,因此我們想著用二分法查詢最小的元素。

思路:

(1)我們用兩個指標left,right分別指向陣列的第乙個元素和最後的乙個元素。按照題目旋轉的規則,第乙個元素應該是大於最後乙個元素的。如果不是旋轉,則第乙個元素一定小於最後乙個元素

(2)找到陣列的中間元素

中間元素大於第乙個元素,則中間元素位於前面的遞增陣列,此時最小元素位於中間元素的後面。我們可以讓第乙個指標left指向中間元素

中間元素小於第乙個元素,則中間元素位於後面的遞增子陣列,此時最小元素位於中間元素的前面。我們可以讓第二個指標right指向中間元素。

移動之後,第二個指標仍然位於後面的遞增陣列中。

(3)按照以上思路,第乙個指標left總是指向前面遞增陣列的元素,第二個指標right總是指向後面遞增的陣列元素。

最終第乙個指標將指向前面陣列的最後乙個元素,第二個指標指向後面陣列中的第乙個元素。

也就是說他們將指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素,這就是迴圈的結束條件。

到目前為止以上思路很耗的解決了沒有重複數字的情況,這一道題目新增上了這一要求,有了重複數字。

我們看一組例子:{1,0,1,1,1} 和 {1,1, 1,0,1} 都可以看成是遞增排序陣列{0,1,1,1,1}的旋轉。

這種情況下我們無法繼續用上一道題目的解法,去解決這道題目。因為在這兩個陣列中,第乙個數字,最後乙個數字,中間數字都是1。

第一種情況下,中間數字位於後面的子陣列,第二種情況,中間數字位於前面的子陣列。

因此當兩個指標指向的數字和中間數字相同的時候,我們無法確定中間數字1是屬於前面的子陣列(綠色表示)還是屬於後面的子陣列(紫色表示)。

也就無法移動指標來縮小查詢的範圍。

class solution    //判斷是否找到符合我們要找的數字,當兩個數相鄰時,說明右邊的數字的就是我們要找的數。

int mid=left +(right-left)/2;

//若是無法確定中間的元素是屬於前面陣列還是後面的陣列只能順序查詢

if(rotatearray[left]>=rotatearray[right]&& rotatearray[left]>=rotatearray[mid])

return minorder(rotatearray,left,right);

//若是中間的元素是前面的陣列

if(rotatearray[left]<=rotatearray[mid])

left=mid;

else //若是中間的元素是後面的陣列

right=mid;

}return rotatearray[mid];

}private:

int minorder(vector&num, int left, int right)

return result;

}};

旋轉陣列的最小數

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

旋轉陣列的最小陣列

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1。示例 1 輸入 3,4,5,1,2 輸出 1 示例 2 輸入 2,2,2,0,1 輸出 ...

旋轉陣列的最小數量

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