原部落格:設陣列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實現:
publicclass
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 ...