劍指Offer 旋轉陣列的最小數字

2021-09-27 07:08:07 字數 1692 閱讀 1859

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

note:給出的所有元素都大於0,若陣列大小為0,請返回0。

如果直接使用順序查詢,時間複雜度為 o(n

)o(n)

o(n)

,完全沒用到旋轉陣列的特性,顯然不合適。

觀察可以發現,旋轉後的陣列分成兩個序列,而兩個序列都是非遞減排序,前面的序列的元素都大於或者等於後面序列的元素。另外最小的元素剛好是這兩個序列的右邊分界線。旋轉後的陣列在一定程度上也是排序的,可以採用二分查詢,時間複雜度為o(l

og2n

)o(log_2)

o(log2

​n)。

用二分查詢的思想,設定左指標left,右指標right和中間指標mid。

當mid指向的值大於或等於left指向的值,說明要找的最小元素在mid後面,所以令left等於mid。

當mid指向的值小於或等於right指向的值,說明要找的最小元素在mid前面,所以令right等於mid。

當left和right相鄰時,可以判斷出最小元素就是right指向的值。

特殊情況是,旋轉的元素數目為0,即不旋轉,那麼第乙個元素就是最小元素。

class

solution

int left =0;

int right = size -1;

int mid =0;

while

(rotatearray[left]

>= rotatearray[right]

) mid =

(left + right)/2

;if(rotatearray[mid]

>= rotatearray[left]

)else

}return rotatearray[0]

;// 無旋轉,第1個為最小值}}

;

看了其他人的一些答案,發現還有一種特殊情況沒考慮。假設初始陣列是[1, 2, 2, 2, 2],旋轉後是[2, 2, 2, 1, 2],計算left、right和mid時發現這三個位置的數都是2,此時上面的**無法判斷最小值1是在左邊還是右邊,所以需要特判並進行順序查詢。

class

solution

int left =0;

int right = size -1;

int mid =0;

while

(rotatearray[left]

>= rotatearray[right]

) mid =

(left + right)/2

;// 特判,當left、right和mid位置的數相同

if(rotatearray[left]

== rotatearray[mid]

&& rotatearray[mid]

== rotatearray[right])}

return result;}if

(rotatearray[mid]

>= rotatearray[left]

)else

}return rotatearray[0]

;// 無旋轉,第1個為最小值}}

;

劍指offer 旋轉陣列的最小數

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

劍指offer 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個排好序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。分析 這道題最直觀的解法並不難。從頭到尾遍歷陣列一次,就能找出最小的元素,時間複雜度顯然是o n 但這個思路沒有利用輸入陣列的特性...

劍指offer 旋轉陣列的最小數字

記錄來自 劍指offer 上的演算法題。題目描述如下 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個選擇,輸出旋轉陣列的最小元素。例如陣列是的乙個旋轉,該陣列的最小值是1。這裡可以採用二分查詢的想法,使用兩個指標,乙個指向第乙個元素,乙個指向末尾元素,...