有兩個已經公升序排列的陣列a和b, 它們的長度分別為m和n,求這兩個陣列的中位數。注意,如果m+n為奇數,則中位數為正中間那個數; 如果m+n為偶數,則中位數為正中間兩個數的平均值。這是一道很經典的面試題,本人在去vmware面試的時候被問到過,當時我只給出了o(m+n)的演算法。 仔細想來,有如下三種方法求解。
方法一: 申請乙個陣列c, 長度為m+n。將a和b歸併排序到c中;然後求解其中位數。
1int 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)。
1int 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 ...