我们知道如果数组有序,我们可以在O(1)的时间内找到第k小的数,但是如何在两个有序数组中找到第k的数呢?我们可以在O(logn)的时间内找到这个数。貌似只要是在有序数列中找东西,大部分的时间复杂度都是O(logn),因为我们有神器二分查找。。
int GetTopK(int* A, int * B, int lengthA, int lengthB, int k)
{
if(lengthA + lengthB < k)
{
return -1;
}
if(lengthA >= k &&A[k - 1]< B[0])
{
return A[k - 1];
}
if(lengthB >=k && B[k-1] < A[0])
{
return B[k-1];
}
int AS = -1;
int BS = -1;
if(k/2 < lengthA)
{
AS = k/2;
}
else
{
AS = lengthA;
BS = k - lengthA;
}
if(BS == -1)
{
if(k/2 < lengthB)
{
BS = k/2;
}
else
{
BS = lengthB;
AS = k - lengthB;
}
}
if(A[AS] < B[BS])
{
if( A[AS] > B[BS-1])
{
return B[BS];
}
return GetTopK(&A[AS], B,lengthA- k / 2, k / 2, k / 2);
}
if(A[AS] > B[BS] )
{
if(A[AS -1] < B[BS])
{
return A[AS];
}
return GetTopK(A, &B[BS],k/2, lengthB - k/2, k / 2);
}
}