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