两个整数递增序列A,B分别有n和m个元素,求第k大的数

//网上常见的是用归并排序的merge函数做,没能考虑到去除重复元素的问题。
我的思路:遍历数组a和b,挑选较小者入数组c,中间注意去重。然后输出c的第len-k个位置上的元素即为第k大
void findKElem(int a[], int b[], int n, int m, int k)
{

    int i = 0, j = 0, s = 0;
    int c[n + m];
    //为了去重,先处理下标为0的元素
    if (a[0] <= b[0])
    {
        c[0] = a[0];
        s++;
        i++;
    }
    else
    {
        c[0] = b[0];
        s++;
        j++;
    }
    while (i < n || j < m)
    {
        if (a[i] <= b[j])
        {

            if (a[i] != c[s - 1]) //去重复,否则有可能造成a[5] = {1, 2, 3, 4, 5}; b[5] = {1, 3, 5, 6, 9};1 1 2 3 3 4 5 5 6 9,第四大是5,但其实是4
                c[s++] = a[i];
            i++;
        }
        else
        {
            if (b[j] != c[s - 1])
                c[s++] = b[j];
            j++;
        }
    }
    cout << c[s - k];//注意第一大位于s-1,第二大位于s-2...第k大位于s-k。(s是数组c的长度)
}

猜你喜欢

转载自blog.csdn.net/qq_36626914/article/details/106867880