1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

寻找已排序的连个数组的第k个元素

Posted on 2013-10-03 15:08  1957  阅读(343)  评论(0编辑  收藏  举报

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, 那么就是两个数组第一个元素中最小的那个。