把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為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...