刷題筆記 旋轉陣列的最小數字(C )

2021-10-01 18:29:40 字數 1688 閱讀 9287

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

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

note:給出的所有元素都大於0,若陣列大小為0,請返回0

答:將原本是乙個有序陣列一分為二,分成兩個有序陣列,並調換位置。

例如 ->   ->

答:最小數一定在後面那個有序陣列。

我們學過有序陣列的二分法查詢,此處我們可以採取類似的二分法查詢,來判斷左右兩個索引分別在哪個陣列。注意,第二個的所有數值都是小於。

如果左右兩個索引左右相鄰,則右邊索引的數值為最小值。

如果中間索引的數值大於等於左邊索引的數值,則中間索引在第乙個有序陣列中,將中間索引的位置賦值於左邊索引。

如果中間索引的數值小於左邊索引的數值,則中間索引處於第二個有序陣列中,將中間索引賦值給右邊索引。

特殊情況:

如果把排序陣列的0個元素搬到最後面,這仍然是旋轉陣列,我們的**需要支援這種情況。如果發現陣列中的乙個數字小於最後乙個數字,就可以直接返回第乙個數字了。

(如下圖)左邊索引的數值、右邊索引的數值以及中間索引的數值相等,我們無法判斷中間的數字1是數以前面的遞增子陣列還是後面的遞增子陣列。正樣的話,我們只能進行順序查詢。

int left = 0; //左索引

int right = size - 1; //右索引

//中間索引,特殊情況1:若沒有旋轉,即旋轉個數為0,則第乙個變為最小值

int mid = 0;

while(rotatearray[left] >= rotatearray[right])

mid = left + (right - left) / 2; //計算中間指標位置

//特殊情況2:如果無法確定中間元素是屬於前面還是後面的遞增子陣列,只能順序查詢

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

//中間元素位於前面的遞增子陣列,此時最小元素位於中間元素的後面

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

//中間元素位於後面的遞增子陣列,此時最小元素位於中間元素的前面

else

}return rotatearray[mid];

}private:

//順序尋找最小值

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

}return result;}};

c 刷題 旋轉陣列的最小數字

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

刷題 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,且前面的子陣列的元素都大...

旋轉陣列最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...