• 两个已排列好的数组(从小到大)找出第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);
    }
  • 相关阅读:
    AS快捷键的设置
    hausaufgabe--python 23- Recurse 2
    hausaufgabe--python 22- Recurse
    hausaufgabe--python 21_ Lambda
    hausaufgabe--python 20-Closure functions 2
    hausaufgabe--python 20- usage of Closure
    hausaufgabe--python 19- Functions 2
    hausaufgabe--python 18- Defined specific Functions
    hausaufgabe--python 17- Function definition
    hausaufgabe--python 16- Sequenz
  • 原文地址:https://www.cnblogs.com/XieJunWei666/p/14198831.html
Copyright © 2020-2023  润新知