面试题:找两个有序数组所有数第K小的数

给定两个有序数组arr1和arr2,再给定一个整数k,返回两个数组中所有数中第k小的数。要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M, N}) )

例如:
arr1 = {1,2,3,4,5}
arr2 = {3,4,5}
k = 1;
因为1为所有数中最小的,所以返回1
arr1 = {1,2,3}
arr2 = {3,4,5,6}
k = 4
因为3为所有数中第4小的数,所以返回3
#include <iostream>
#include <assert.h> 
#include <vector>
using namespace std;

int FindKthNum(int* arr1, int len1, int* arr2, int len2, int k)
{
    assert(k >= 0 && len1 + len2 >= k);

    if(len1 > len2)
    {
        return FindKthNum(arr2, len2, arr1, len1, k);
    }

    if(len1 == 0)
        return arr2[k-1];
    if(k == 1)
        return min(arr1[0], arr2[0]);                          

    int range1 = min(k/2, len1), range2 = k - range1;
    // arr1[0,range1) + arr2[0,range2) 是两个数组的前k个数
    // 1.arr1[range1-1] == arr2[range2-1],则这个两个数其中一个就是第k个
    // 2.arr1[range1-1] < arr2[range2-1],则排除arr1[0,range1)这一部分
    // 3.arr1[range1-1] > arr2[range2-1],则排除arr2[0,range2)这一部分

    if(arr1[range1-1] == arr2[range2-1])
        return min(arr1[range1-1], arr2[range2-1]);
    else if(arr1[range1-1] < arr2[range2-1])//去掉range1个
        return FindKthNum(arr1+range1, len1-range1, arr2, len2, k-range1);
    else
        return FindKthNum(arr1, len1, arr2+range2, len2-range2, k-range2);

}

void test()
{
    int a1[5] = {1,2,3,4,5};
    int a2[3] = {3,4,5};

    cout<<FindKthNum(a1, 5, a2, 3, 1)<<endl;
    int a11[3] = {1,2,3};
    int a22[4] = {3,4,5,6};
    vector<int> arr11(a11, a11+3);
    vector<int> arr22(a22, a22+4);
    cout<<FindKthNum(a11, 3, a22, 4, 4)<<endl;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值