把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note:給出的所有元素都大於0,若陣列大小為0,請返回0。思路一:暴力解法,乙個乙個比較,時間複雜度較高,**較簡單,略。
思路二:
我們注意到旋轉之後的陣列實際上可以劃分為兩個排序的子陣列,而且前面的子陣列的元素都是大於或者等於後面子陣列的元素。我們還注意到最小的元素剛好是這兩個子陣列的分界線。在排序的陣列中我們可以利用二分查詢來實現o(logn)的查詢。本題給出的陣列在一定程度上是排序的,因此我們可以試著用二分查詢的思路來尋找這個最小的元素。
以前面的例子為例,我們先把第乙個指標指向第0個元素,把第二個指標指向第4個元素,如圖所示。位於兩個指標中間(在陣列的下標是2)的數字是5,它大於第乙個指標指向的數字。因此中間數字5一定位於第乙個遞增字陣列中,並且最小的數字一定位於它的後面。因此我們可以移動第乙個指標讓它指向陣列的中間。
此時位於這兩個指標中間的數字為1,它小於第二個指標指向的數字。因此這個中間數字為1一定位於第二個遞增子陣列中,並且最小的數字一定位於它的前面或者它自己就是最小的數字。因此我們可以移動第二個指標指向兩個指標中間的元素即下標為3的元素。
此時兩個指標的距離為1,表明第乙個指標已經指向了第乙個遞增子陣列的末尾,而第二個指標指向第二個遞增子陣列的開頭。第二個子陣列的第乙個數字就是最小的數字,因此第二個指標指向的數字就是我們查詢的結果。
我們再來看乙個例子。陣列{1,0,1,1,1}和陣列{1,1,1,0,1}都可以堪稱遞增排序陣列{0,1,1,1,1}的旋轉,圖2分別畫出它們由最小數字分隔開的兩個子陣列。
這兩種情況中,第乙個指標和第二個指標指向的數字都是1,並且兩個指標中間的數字也是1,這3個數字相同。在第一種情況中,中間數字(下標為2)位於後面是子陣列;在第二種情況中,中間數字(下標為2)位於前面的子陣列中。因此,當兩個指標指向的數字及它們中間的數字三者相同的時候,我們無法判斷中間的數字是位於前面的子陣列中還是後面的子陣列中國,也無法移動兩個指標來縮小查詢的範圍。此時,我們不得不採用順序查詢的方法。
c++
class
solution
return rotatearray[low];}
private:/
/左、右、中、指標相等時
intmininorder
(vector<
int>
&num,
int left,
int right)
return result;}}
;
參考
劍指offer 旋轉陣列的最小數
題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。public class test system.out.pr...
劍指offer 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...
劍指offer 旋轉陣列的最小數字
記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...