兩個有序陣列的中位數求解方法

2022-06-01 12:00:17 字數 1065 閱讀 5262

有兩個已經公升序排列的陣列a和b, 它們的長度分別為m和n,求這兩個陣列的中位數。注意,如果m+n為奇數,則中位數為正中間那個數; 如果m+n為偶數,則中位數為正中間兩個數的平均值。這是一道很經典的面試題,本人在去vmware面試的時候被問到過,當時我只給出了o(m+n)的演算法。 仔細想來,有如下三種方法求解。

方法一: 申請乙個陣列c, 長度為m+n。將a和b歸併排序到c中;然後求解其中位數。

1

int get_median(int a, size_t na, int b, size_t nb, int *median)221

22while (i 23 c[k++] = a[i++];

2425

while (j 26 c[k++] = b[j++];

2728

/*3. get the median

*/29 *median = (nc % 2 == 0) ? (c[nc/2 - 1] + c[nc/2]) / 2 : c[nc/2

];30

31/*

4. free the aux

*/32

free

(c);

3334

return0;

35 }

方法二: 對方法一的空間複雜度進行改進,改進後的空間複雜度為o(1),但時間複雜度仍為o(m+n)。

1

int get_median(int a, size_t na, int

b, size_t nb)223

24while (i 3233

while (j 4142

done:

43 median = (nc % 2 != 0) ? this : (this + prev) / 2;44

return

median;

45 }

方法三: 採用分治策略降低時間複雜度。

。。。未完待續。。。

兩個有序陣列的中位數求解方法

有兩個已經公升序排列的陣列a和b,它們的長度分別為m和n,求這兩個陣列的中位數。注意,如果m n為奇數,則中位數為正中間那個數 如果m n為偶數,則中位數為正中間兩個數的平均值。這是一道很經典的面試題,本人在去vmware面試的時候被問到過,當時我只給出了o m n 的演算法。仔細想來,有如下三種方...

兩個有序陣列中位數

大小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 ...