面試題11 旋轉陣列的最小數字

2021-08-21 07:35:57 字數 1422 閱讀 4712

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

解題思路:

輸入的陣列為非減排序陣列的旋轉,陣列分為兩個排好序的陣列。其中前半部分和後半部分都為非減陣列,且前半部分的數大於等於後半部分。

對於排序的陣列->二分查詢

1.取陣列中間數,若中間的數大於等於陣列第乙個數,說明中間數字於前半個非遞減陣列中,因此最小值在陣列的後半部分。

2.若中間數小於等於陣列最後乙個數,說明中間數字於後半個非遞減陣列中,因此最小值在陣列的前半部分

3.若陣列起始數,中間數,末位數相同,則不能判斷最小值位於陣列的前半部分還是後半部分,需要採用暴力排序,依次比較查詢。(特殊輸入:重複數字的陣列)

4.直到指向陣列前和後的指標下標相鄰時,後面的指標對應陣列的最小數字。

測試用例:

1.邊界值測試:輸入直接為非遞減陣列(未經過旋轉)

如果第乙個數字小於最後乙個數字,說明陣列遞增,可以直接返回第乙個數字作為最小數字。

2.輸入陣列含有重複的數字

int minnumberinrotatearray(vector

array)

int left = 0;

int right = array.size() - 1;

int mid = left;

// 當最左邊值大於等於最右邊時候

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

// 如果陣列長度是2個以上

mid = (left + right) / 2;

// 假如最左邊和中間以及最右邊值都相等,只能進行順序查詢,如

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

return orderfind(array, left, right);

// 如果最左邊小於等於中間,說明最小值在後半部分,把mid位置標記為最左側如

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

left = mid;

// 如果最左側大於等於中間值,說明最小值在前半部分,把mid位置標記為最右側

else

if (array[mid] <= array[right])

right = mid;

}return

array[mid];

}int orderfind(vector

array, int left, int right)

return min;

}

面試題11 旋轉陣列的最小數字

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

面試題11 旋轉陣列的最小數字

把乙個陣列最開始若干個元素搬到陣列的末尾 一般方法遍歷,o n 將這個陣列看作是兩個排序陣列 利用二分查詢的思想,比較中間的數字與兩頭 如果中間元素位於第乙個遞增陣列,大於 等於第乙個指標,範圍 右邊 如果中間元素位於後面遞增陣列,它應該小於 等於第二個指標 左邊 注意改變後指向中間元素 最後結果是...

面試題11 旋轉陣列的最小數字

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