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

2022-06-01 19:24:09 字數 1397 閱讀 7127

// 面試題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 將這個陣列看作是兩個排序陣列 利用二分查詢的思想,比較中間的數字與兩頭 如果中間元素位於第乙個遞增陣列,大於 等於第乙個指標,範圍 右邊 如果中間元素位於後面遞增陣列,它應該小於 等於第二個指標 左邊 注意改變後指向中間元素 最後結果是...