// 面試題11:旋轉陣列的最小數字
// 題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
// 輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列
// 為的乙個旋轉,該陣列的最小值為1。
最簡單的方法就是從頭到尾遍歷,遍歷完成後就可以找出最小的元素,但是這樣的時間效率是o(n)。
而且這樣的演算法效率很低,毫無技術可言。
旋轉陣列其實就是兩個排好序的公升序陣列,前邊陣列元素都是》後邊陣列元素的,可以採用二分查詢的思想。
兩個指標p1,p2分別指向陣列的頭部和尾部。
p1 p2中間元素如果》=p1,說明中間元素位於前面的公升序陣列中,將其賦給p1
p1 p2中間元素如果<=p2,說明中間元素位於後面的公升序陣列中,將其賦給p2
重複這個過程,直到p1 p2距離為1,p2指向的就是我們要找的最小元素。
有幾種特殊情況需要考慮到:
1)陣列最開始的0的元素被搬運到了陣列的末尾,也就是旋轉後還是。
這種情況可以在最開始判斷,如果p1指向的元素
2)p1和p2指向的元素,以及中間元素相等,無法判斷中間元素是屬於前後那個陣列,也無法移動指標來縮小範圍,
這個時候我們只能使用最原始的順序查詢來尋找最小值。
if(引數輸入無效)throw exception;
p1p2分別指向陣列首尾元素;
pmiddle=p1;
while(p1元素》=p2元素)
return pmiddle;
int min(int* numbers, int length)//首尾中元素大小相等,無法縮小範圍
//開始順序查詢
if (numbers[pindex] == numbers[pend]
&& numbers[pindex] == numbers[pmiddle])
return minorder(numbers, pindex, pend);
//根據中間元素與首尾元素大小
//縮小查詢範圍
if (numbers[pmiddle] >= numbers[pindex])
pindex = pmiddle;
else if (numbers[pmiddle] <= numbers[pend])
pend = pmiddle;
} return numbers[pmiddle];
}int minorder(int* numbers, int index, int end)
return result;
}
面試題11 旋轉陣列的最小數字
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。解題思路 輸入的陣列為非減排序陣列的旋轉,陣列分為兩個排好序的陣...
面試題11 旋轉陣列的最小數字
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。類似二分查詢,旋轉陣列由兩個有序陣列組成 class solut...
面試題11 旋轉陣列的最小數字
把乙個陣列最開始若干個元素搬到陣列的末尾 一般方法遍歷,o n 將這個陣列看作是兩個排序陣列 利用二分查詢的思想,比較中間的數字與兩頭 如果中間元素位於第乙個遞增陣列,大於 等於第乙個指標,範圍 右邊 如果中間元素位於後面遞增陣列,它應該小於 等於第二個指標 左邊 注意改變後指向中間元素 最後結果是...