求兩個有序陣列的中位數

2022-09-12 04:57:12 字數 1263 閱讀 3739

原部落格:

設陣列a的長度為m, 陣列b的長度為n, 兩個陣列都都是遞增有序的。

求這兩個陣列的中位數

首先我們看看中位數的特點,乙個大小為n的陣列,

如果n是奇數,則中位數只有乙個,陣列中恰好有  (n-1)/2 個元素比中位數小。

如果n是偶數,則中位數有兩個(下中位數和上中位數),這裡我們只求下中位數,對於下中位數,

陣列中恰好有(n-1)/2個元素比下中位數小。

此題中,中位數只有乙個,它前面有 c = (m+n-1)/2 個數比它小。中位數要麼出現在陣列a中,

要麼出現在陣列b中,我們先從陣列a開始找。考察陣列a中的乙個元素a[p], 在陣列a中,

有 p 個數比a[p]小,如果陣列b中恰好有 c-p 個數比 a[p] 小, 則倆陣列合併後就恰好有 c 個數比a[p]小,

於是a[p]就是要找的中位數。 如下圖所示:

如果a[p] 恰好位於 b[c-p-1] 和 b[c-p] 之間,則 a[p] 是中位數

如果a[p] 小於 b[c-p-1] ,說明a[p] 太小了,接下來從 a[p+1] ~a[m-1]開始找

如果a[p] 大於 b[c-p] ,說明a[p] 太大了,接下來從 a[0] ~a[p-1]開始找。

如果陣列a沒找到,就從陣列b找。

下面給出j**a實現:

public

class

findmedian ;

int b = ;

system.out.print(findmedian(a, b, a.length, b.length, 0, a.length-1));

}/*** 若m+n為奇數,放回中位數;偶數放回下中位數

* @param

a *

@param

b *

@param

m 陣列a長度

* @param

n 陣列b長度

* @param

s p的上下界線

* @param

t *

@return

中位數

*/public

static

int findmedian(int a, int b, int m, int n, int s, int

t)}

求兩個有序陣列的中位數

要求 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 例如 nums1 1,3 nums2 2 則中位數是 2.0 nums1 1,2 nums2 3,4 則中位數是 2 3 2 2.5 演算法解析...

兩個有序陣列中位數

大小m和n分別有兩個排序陣列a和b。找到兩個排序陣列的中值。總的執行時間複雜度應該是o log m n class solution return findkth a,b,0,0,m,n,s 2 findkth a,b,0,0,m,n,s 2 1 2 private double findkth v...

兩個有序陣列中位數

首先我們可以不斷分割得到這個kkk。首先兩個陣列都分配k 2 frac 2k 如果第k 2 frac 2k 個數,第乙個陣列小於第二個陣列,那麼第乙個陣列的k 2 frac 2k 個數一定不是答案。問題可以變成乙個子問題,上乙個陣列從k2 1 frac 1 2k 1開始。相當於我們每次要去掉k 2 ...