给定两个数组AB,其大小分别为mn,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第k大的元素,其中,1\le k\le(m+n)。例如,对于数组A=[1,3,5,7,9]B=[2,4,6,8]。我们记第k大的数为max_{k-th},则k=4时,max_{4-th}=4。这是因为排序之后的数组A+B=[1,2,3,4,5,6,7,8,9],第4大的数是4。我们针对这一个问题进行探讨。

2、算法一

  第一眼看到这个题的时候,我们能够很快地想出来最基本的一种解法:对数组AB进行合并,然后求出其第k大的数,即找到答案。合并的过程,我们可以参考归并排序的合并子数组的过程,时间复杂度为O(m+n)。下面给出算法:

int findKthMaxNumOfArrays(int *a,int m,int *b,int n,int k)
{
    int *p=a;
    int *q=b;
    int i=0;
    int j=0;
    int cur=0;
    while(i<m&&j<n)
    {
        if(a[i]<b[j])
        {
            cur++;
            if(cur==k) return a[i];
            i++;
        }
        else 
        {
            cur++;
            if(cur==k) return b[j];
            j++;
        }
    }
    while(i<m)
    {
        cur++;
        if(cur==k) return a[i];
        i++;
    }
    while(j<n)
    {
        cur++;
        if(cur==k) return b[j];
        j++;
    }
}
View Code

相关文章: