A,B是两个已经从小到大排序好了的数组,球这两个数组合并后的第k个元素。
很简单的想法,根据定义,把两个数组合并到一起,然后排序,然后就能得到了。
但是这样的复杂度是nlogn
还有就是用归并的思想,来找第k个元素,这样的复杂度是k
那还有没有快一点的呢?
我们比较A[k/2-1] , B[k/2-1] (减1是因为从0开始)
如果
A[k/2 - 1] < B[k/2 - 1] ,那么A[0..k/2-1]这段就可以抛弃了,他一定是在第k大的数的前面。
证明很简单,就不说了。。。
A[k/2-1] > B[k/2 - 1] 同上
如果相等,那就说明,任意一个就是第k大的元素。
那么我们就可以递归的来球这个问题了。
int find_kth(int * a , int na , int *b , int nb , int k) { if(nb < na) return find_kth(b,nb,a,na,k); if(na == 0) return b[k - 1]; if(k == 1) return min(a[0] , b[0]); int pa = min(k / 2 , na); int pb = k - pa; if(a[pa - 1] < b[pb - 1]) return find_kth(a + pa, na - pa , b , nb , k - pa); else if(a[pa -1] > b[pb - 1]) return find_kth(a , na , b + pb , nb - pb , k - pb); else return a[pa - 1]; }
就是需要处理几个边界问题。
如果有一个数组为空,那么直接返回另外一个的k-1个元素
如果k = 1, 那么就是两个数组第一个元素中最小的那个。
by 1957