在兩個長度相等的排序陣列中找到上中位數
給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。
上中位數:假設遞增序列長度為n,若n為奇數,則上中位數為第n/2+1個數;否則為第n個數
[要求]
時間複雜度為o(l
ogn)
o(logn)
o(logn
),額外空間複雜度為o(1
)o(1)
o(1)
輸入描述:
第一行乙個整數n,表示陣列大小。
接下來一行n個整數,表示arr1內的元素
再接下來一行n個整數,表示arr內的元素
輸出描述:
輸出乙個整數表示答案
示例1輸入
4
1 2 3 4
3 4 5 6
輸出3
說明總共有8個數,上中位數是第4小的數,所以返回3。
示例2
輸入
3
0 1 2
3 4 5
輸出2
說明總共有6個數,那麼上中位數是第3小的數,所以返回2
備註:
1 ⩽n
⩽105
1 \leqslant n \leqslant 10^5
1⩽n⩽1050⩽
arr1
i,ar
r2i⩽
10
90 \leqslant arr_}, arr_} \leqslant 10^9
0⩽arr1
i,
arr2
i⩽
109題解:
首先可以確定是二分,我們重新定義一下問題:在 a1[s1…e1] 和 a2[s2…e2] 上尋找兩段陣列的上中位數,並且兩段陣列長度相等。
若 a1[mid1] < a2[mid2] ,分析同 2
**:
#include
#include
using
namespace std;
const
int n =
100000
;int n;
int a[n]
;int b[n]
;int
main
(void
)int sa =
0, ea = n -1;
int sb =
0, eb = n -1;
int ma, mb, ret =-1
;while
( sa < ea )
int bit =
((ea - sa +1)
&1)^
1;if( a[ma]
> b[mb]
)else}if
( ret ==-1
) ret =
min( a[sa]
, b[sb]);
printf
("%d\n"
, ret)
;return0;
}
在兩個長度相等的排序陣列中找到上中位數
給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。上中位數 假設遞增序列長度為n,若n為奇數,則上中位數為第n 2 1個數 否則為第n個數 輸入為 arr1 1,2,3,4 arr2 3,4,5,6 輸出為3 輸入為 arr1 0,1,2 arr2 3,4,...
演算法總結之 在兩個長度相等的排序陣列中找到上中位數
題目描述 arr1 和 arr2 長度都為n 求兩個陣列中所有數的上中位數 要求 時間複雜度 o logn 額外空間複雜度o 1 這道題目的方法比較好玩 這兩個陣列如下表示 arr1 start1.end1 arr2 start2.end2 如果start1 start2 那麼也有start2 en...
牛客題霸 在兩個長度相等的排序陣列中找到上中位數
題目描述 給定兩個有序陣列arr1和arr2,已知兩個陣列的長度都為n,求兩個陣列中所有數的上中位數。上中位數 假設遞增序列長度為n,若n為奇數,則上中位數為第n 2 1個數 否則為第n 2個數 要求 時間複雜度為o logn 額外空間複雜度為o 1 示例1輸入 1,2,3,4 3,4,5,6 返回...