在兩個長度相等的排序陣列中找到上中位數

2021-10-12 20:30:48 字數 1628 閱讀 8159

在兩個長度相等的排序陣列中找到上中位數

給定兩個有序陣列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 返回...