題目描述 把一個數組最開始的若幹個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。NOTE:給出的所有元素都大於0,若數組大小為0,請返回0。 解題思路 鏈接: ...
題目描述
把一個數組最開始的若幹個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。
NOTE:給出的所有元素都大於0,若數組大小為0,請返回0。
解題思路
鏈接:https://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba?f=discussion來源:牛客網
採用二分法解答這個問題, mid = low + (high - low)/2 需要考慮三種情況: (1)array[mid] > array[high]: 出現這種情況的array類似[3,4,5,6,0,1,2],此時最小數字一定在mid的右邊。 low = mid + 1 (2)array[mid] == array[high]: 出現這種情況的array類似 [1,0,1,1,1] 或者[1,1,1,0,1],此時最小數字不好判斷在mid左邊 還是右邊,這時只好一個一個試 , high = high - 1 (3)array[mid] < array[high]: 出現這種情況的array類似[2,2,3,4,5,6,6],此時最小數字一定就是array[mid]或者在mid的左 邊。因為右邊必然都是遞增的。 high = mid 註意這裡有個坑:如果待查詢的範圍最後只剩兩個數,那麼mid 一定會指向下標靠前的數字 比如 array = [4,6] array[low] = 4 ;array[mid] = 4 ; array[high] = 6 ; 如果high = mid - 1,就會產生錯誤, 因此high = mid 但情形(1)中low = mid + 1就不會錯誤 鏈接:https://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba?f=discussion
來源:牛客網
public
class
Solution {
public
int
minNumberInRotateArray(
int
[] array) {
int
low =
0
;
int
high = array.length -
1
;
while
(low < high){
int
mid = low + (high - low) /
2
;
if
(array[mid] > array[high]){
low = mid +
1
;
}
else
if
(array[mid] == array[high]){
high = high -
1
;
}
else
{
//這裡就是上面說的那個坑
high = mid;
}
}
return
array[low];
}
}