给定两个有序数组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;
if(arr1[range1-1] == arr2[range2-1])
return min(arr1[range1-1], arr2[range2-1]);
else if(arr1[range1-1] < arr2[range2-1])
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;
}