把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為1。
note:給出的所有元素都大於0,若陣列大小為0,請返回0。
將發現,旋轉之後的陣列實際上可以劃分為兩個排序的字陣列,而且前面的字陣列的元素大於或者等於後面字陣列的元素。 而且 最小的元素剛好是兩個子陣列的分界線。 已知這兩個子陣列均為有序陣列,大陣列在一定程度上有序,考慮用二分查詢,時間複雜度o(logn)。
可以發現,第乙個指標總是指向前面遞增陣列的元素,第二個指標總是指向後面遞增陣列的元素。最終它們會指向兩個相鄰的元素,而第二個指標指向的剛好是最小的元素,這就是迴圈結束的條件。
注意:特殊情況,如果把排序陣列的0個元素搬到最後面,這仍然是旋轉陣列,如果發現陣列中的乙個數字小於最後乙個數字,就可以直接返回第乙個數字了。
還有一種情況:
這種情況下, 第乙個指標指向的數字、第二個指標指向的數字和中間的數字三者相等,我們無法判斷中間的數字1是數以前面的遞增子陣列還是後面的遞增子陣列。這樣的話,我們只能進行順序查詢。
class
solution
int left =0;
//左指標
int right = size -1;
//右指標
int mid =0;
//中間指標
while
(rotatearray[left]
>= rotatearray[right]
) mid = left +
(right - left)/2
;//計算中間指標位置
//特殊情況:如果無法確定中間元素是屬於前面還是後面的遞增子陣列,只能順序查詢
if(rotatearray[left]
== rotatearray[right]
&& rotatearray[mid]
== rotatearray[left]
)//中間元素位於前面的遞增子陣列,此時最小元素位於中間元素的後面
if(rotatearray[mid]
>= rotatearray[left]
)//中間元素位於後面的遞增子陣列,此時最小元素位於中間元素的前面
else
}return rotatearray[mid];}
private
://順序尋找最小值
intmininorder
(vector<
int>
&num,
int left,
int right)
}return result;}}
;
6 旋轉陣列 的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。演算法 逐個遍歷,時間複雜度為o n 空間複雜度為o 1 class so...
6 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。解法1 開始沒有get到這個題目的點,個人感覺旋轉後,遍歷到第乙個...
6 旋轉陣列的最小數字
考察 查詢和排序 1 題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非減排序的陣列 後面數大於或者等於前面的數 的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。2 思路1 陣列...