zoukankan      html  css  js  c++  java
  • 寻找已排序的连个数组的第k个元素

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

  • 相关阅读:
    C#之反射
    关系数据库中的函数依赖
    关系型数据库中关系的完整性
    sql的自连接
    sql中的union和union all查询
    c# 泛型之约束
    c#之泛型
    PTA 乙级 1009 说反话(20分) C/C++、Python
    PTA 乙级 1008 数组元素循环右移问题 (20分) C、C++
    PTA 乙级 1007 素数对猜想 (20分) C/C++
  • 原文地址:https://www.cnblogs.com/x1957/p/3350231.html
Copyright © 2011-2022 走看看