xjw666

两个已排列好的数组(从小到大)找出第k个大的数

两个有序数组找到第k个大的元素,常用的方法有先把两个数组进行排序再求;双指针法以及类二分法,类二分法的时间消耗是最少的。

对于第三种方法,网上现在流行的解题说明如下:

存在的问题:如何保证每一个数组元素数目都是大于k/2的?

实际上,第一个数组中的的定位应该放min(k/2,len(array_1)),即k1=min(k/2,len(array_1)),而第二个数组中的定位应该是k-k1,这样就避免了上述的问题,代码如下:

#include<iostream>
#include<vector>
using namespace std;

int findkth(vector<int>::iterator A, vector<int>::iterator B, int a_num,int b_num, int k)
{
    int k1 = min(k / 2,a_num);
    int k2 = k - k1;
    if (a_num > b_num) return findkth(B, A,b_num,a_num, k);
    //if (a_num + b_num < k) return -1;
    if (a_num == 0) return *(B + k - 1);
    if (k == 1) return min(*A, *B);

    if (*(A+k1-1) == *(B+k2-1)) 
    {
        return *(A+k1-1);
    }
    else if (*(A + k1-1) > * (B + k2-1))
    {
        return findkth(A, B + k2, a_num, b_num - k2,k- k2);
    }
    else if (*(A + k1-1) < *(B + k2-1))
    {
        return findkth(A + k1, B, a_num-k1, b_num, k-k1);
    }
}

int main()
{
    vector<int> A = { 1,1,1,2,2,4,5,6,7 };
    vector<int> B = { 4,5,6,7,8,9,10,11 };
    int a[9]= { 1,1,1,2,2,4,5,6,7 };
    int b[7]= { 4,5,6,7,8,9,10 };
    cout << findkth(A.begin(),B.begin(),9,8, 2);
    //cout << Binary_find_Kth(a, 9, b, 7, 16);
}

 

posted on 2020-12-27 21:32  xjw666  阅读(432)  评论(0编辑  收藏  举报

导航