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

2022-08-03 15:15:14 字數 1335 閱讀 7337

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

由於原始陣列是遞增排序的陣列,我們可以發現旋轉之後的陣列仍然可以分為兩個遞增排序的子陣列,而且前乙個子陣列中的任意乙個元素都要大於後面子陣列中的元素,而最小數字就位於兩個子陣列的交界處且位於交界線的右邊。由於本題給出的陣列在一定程度上是排序的,因此我們可以考慮利用二分查詢的思路去尋找最小的元素。

我們利用兩個指標,開始時,乙個指向第乙個元素,另乙個指向末尾元素,中間指標指向第乙個元素(防止出現特列-旋轉陣列就是原陣列),然後我們進行搜尋。如果該中間元素位於前面的子陣列,那麼它應該大於等於第乙個指標指向的元素,此時陣列中最小的元素應該位於該中間元素的後面,我們可以把第乙個指標指向該中間元素,這樣可以縮小尋找的範圍,而且移動之後的第乙個指標仍然位於前面的子陣列;同理,如果該中間元素位於後面的子陣列,那麼它應該小於等於第二個指標指向的元素,此時陣列中最小的元素應該位於該中間元素的前面,我們可以把第二個指標指向該中間元素,這樣可以縮小尋找的範圍,而且移動之後的第二個指標仍然位於後面的子陣列。

這裡還有乙個需要考慮的問題就是,如果中間元素剛好與第乙個元素,第二個元素的值相同,我們就無法區分中間元素位於哪個子陣列,上面的判斷也就出現了偏差,如陣列和陣列都可以看成遞增排序陣列的旋轉,顏色表示了子陣列的構成。在這兩種情況下,第乙個指標和第二個指標指向的數字都是1,並且兩個指標中間的數字也是1.,這3個數字相同,此時我們無法判斷中間的數字是位於前面的子陣列還是位於後面的子陣列。因此,我們不得不採用順序查詢到辦法。

int min(int* numbers,int

length)

indexmid = index1 + (index2 - index1) / 2

;

if(numbers[index1] == numbers[index2] &&numbers[index1] ==numbers[indexmid] )

return

mininorder(numbers,index1,index2);

if(numbers[indexmid] >=numbers[index1])

index1 =indexmid;

else

if(numbers[indexmid] <=numbers[index2])

index2 =indexmid;

}return

numbers[indexmid];

}int mininorder(int* numbers,int index1,int

index2)

}return

nmin;

}

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

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

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

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

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

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