在有序旋轉陣列中找到最小值
有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列[1, 2, 3, 4, 5, 6, 7],可以旋轉處理成[4, 5, 6, 7, 1, 2, 3]等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。
[要求]
期望複雜度為o
(logn
)o(\log n)
o(logn)
輸入描述:
第一行乙個整數n表示陣列大小。
接下來n個數表示陣列內的數。
輸出描述:
輸出乙個整數表示答案
示例1輸入
7
1 2 3 4 5 6 7
輸出1
示例2
輸入
7
4 5 6 7 1 2 3
輸出1
備註:
1 ⩽n
⩽106
1 \leqslant n \leqslant 10^6
1⩽n⩽1061⩽
arri
⩽109
1 \leqslant arr_i \leqslant 10^9
1⩽arri
⩽10
9題解:
二分。注意:二分不一定必須要有單調性,二分的本質是尋找某種性質的分界點。只要找到某種性質,可以確定目標在區間的前半部分還是後半部分,就可以用二分找到這個分界點。
為了便於分析,將陣列中的元素畫在二維座標系中,橫軸代表下標,縱軸代表值。
水平的實線表示相同的元素。可以發現,除了黑色水平那段,其餘部分均滿足二分性質:豎直的虛線左邊的元素均滿足arr
[i]>=a
rr[0
]arr[i]>=arr[0]
arr[i]
>=a
rr[0
],而虛線右邊(去除黑色線段部分)的元素均滿足arr[i]
r[0]
arr[i]ar
r[i]
r[0]
。首先,我們需要把黑色的水平段刪除,至於為什麼刪除呢?考慮一種情況:arr
[mid
]==a
[0]arr[mid] == a[0]
arr[mi
d]==
a[0]
,這種情況下,根本不知道往哪邊走,所以只能刪除。
還需要處理陣列未旋轉的情況。當刪除黑色水平段後,若剩下的最後乙個元素大於等於arr[0],說明陣列完全單調。但最壞情況:元素均相等情況下的時間複雜度為o(n
)o(n)
o(n)
。剩下的就是普通二分了:
**:
#include
using
namespace std;
const
int n =
1000000
;int n;
int a[n]
;int
main
(void
)return0*
printf
("%d\n"
, a[l]);
}
在有序旋轉陣列中找到最小值
題目 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。基本思路 盡可能的利用二分查詢,但是最壞情況仍然無法避免o n 的時間...
在有序旋轉陣列中查詢最小值
有序陣列a經過一次旋轉處理,也可能沒有旋轉,且a中肯能存在重複的數字。例如有序陣列 1,2,3,4,5,6 可以旋轉處理成 4,5,6,1,2,3 特例一,1,2,3,4,4,4,4,4,4 旋轉成 4,4,4,4,4,1,2,3,4 特例二,1,2,3,4,4,4,4,4,4 旋轉成 4,1,2,...
有序旋轉陣列最小值
題目 有序陣列arr可能經過一次旋轉處理,也可能沒有,且arr可能存在重複的數。例如,有序陣列 1,2,3,4,5,6,7 可以旋轉處理成 4,5,6,7,1,2,3 等。給定乙個可能旋轉過的有序陣列arr,返回arr中的最小值。根據題目分析 有序指公升序 旋轉處理將公升序陣列分成前後兩部分,進行整...