題目:把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。
分析:這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o(n)。但這個思路沒有利用輸入陣列的特性,我們應該能找到更好的解法。
我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面的子陣列的元素都大於或者等於後面子陣列的元素。我們還可以注意到最小的元素剛好是這兩個子陣列的分界線。我們試著用二元查詢法的思路在尋找這個最小的元素。
首先我們用兩個指標,分別指向陣列的第乙個元素和最後乙個元素。按照題目旋轉的規則,第乙個元素應該是大於或者等於最後乙個元素的(當然這裡有特列,就是旋轉個數為0即沒有旋轉的時候,我們要單獨處理)。
接著我們得到處在陣列中間的元素。如果該中間元素位於前面的遞增子陣列,那麼它應該大於或者等於第乙個指標指向的元素。此時陣列中最小的元素應該位於該中間元素的後面。我們可以把第一指標指向該中間元素,這樣可以縮小尋找的範圍。同樣,如果中間元素位於後面的遞增子陣列,那麼它應該小於或者等於第二個指標指向的元素。此時該陣列中最小的元素應該位於該中間元素的前面。我們可以把第二個指標指向該中間元素,這樣同樣可以縮小尋找的範圍。我們接著再用更新之後的兩個指標,去得到和比較新的中間元素,迴圈下去。按照上述的思路,我們的第乙個指標總是指向前面遞增陣列的元素,而第二個指標總是指向後面遞增陣列的元素。最後第乙個指標將指向前面子陣列的最後乙個元素,而第二個指標會指向後面子陣列的第乙個元素。也就是它們最終會指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素。這就是迴圈結束的條件。
劍指offer 旋轉陣列的最小數
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...
劍指offer 旋轉陣列的最小數字
記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...
劍指offer 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 既然是旋轉陣列,那麼資料的規律肯定是保持非遞減,但遇到第乙個遞減的...