creative commons
以下均假設a[0…m-1],b[0…n-1];
1)o(n)
假設a,b均以降序排列,宣告兩個指標p,q。p指向a[0], q指向b[0]。再來乙個count=0,用來表示當前已經到第count大了。然後指標開始遊,如果*p > *q,則p++, count++;如果*p < *q,則q++, count++;而如果相等,兩個游標選乙個走即可,同時count++。最後當count==k時,就找到了所有元素的第k大了。
2)o(log(n))
上面o(n)的做法是乙個乙個剪,而這裡,就是一半一半地剪。為了方便理解,這裡就是求兩個陣列的第k小元素(原理是一樣的,第k小即為第(m+n-k)大嘛),且a,b均以公升序排列。因為a, b陣列均已排好序,所以有如下結論(假設k為偶數,奇數同理)。
1』 a 或 b 中有個為空,則直接b[k-1]或a[k-1];
2』 假設m,n>=k/2 (如果不滿足,則下標取自己的上限即可)
因此,由上述條件我們可以推出利用遞迴函式解決問題是極為方便的。遞迴過程及結束條件如下所示(設m < n,暫不防禦型程式設計)
#include
#include
using
namespace
std;
class mysolution
};int main(int argc, char
const *argv)
; int b = ;
mysolution test;
cout
<< test.find_k_min(a, 5, b, 5, 5) << endl;
return
0;}
執行結果就不貼了,心算即可驗證:) 求兩個已排序 公升序 等長的整數陣列所有元素的中位數
演算法課的題目,給定兩個整數陣列x,y,兩個陣列已被排序 公升序 陣列長度都是n,求這2n個數的中位數。最容易想到的是,新建立以個陣列 z 2n 將x,y的所有元素排序放入,然後取中間兩個數,不過當陣列很大時,效率不行啊。不僅空間複雜度很大,重新排序的話也要不少時間.分析 因為兩個陣列已經排序了,可...
合併兩個已排序的陣列
題目描述1 有兩個排序的陣列a1和a2,內存在a1的末尾有足夠多的空餘空間容納a2。請實現乙個函式,把a2中的所有數字插入a1中,並且所有的數字是排序的。void mergelist int la,int a length,int lb,int b length for int i 0 i a le...
求兩個整型陣列的非共有元素
題目描述 給定兩個整型陣列,要求找出不是兩者共有的元素。輸入 有兩行。第1行先給出正整數n n 20 隨後是n個整數,其間以空格分隔。第2行先給出正整數m m 20 隨後是m個整數,其間以空格分隔。輸出 僅一行。按照數字給出的順序輸出不是兩陣列共有的元素,數字間以空格分隔。題目保證至少存在乙個這樣的...