问题描述:已知两个有序的序列,找到他们的中位数,复杂度要求O(log(m+n))
问题分析:
代码:
class Solution
{
public:
double FindMin(const vector<int> &A,const vector<int> &B)
{
const int m = A.size();
const int n = B.size();
int total = m + n;
if(total & 0x1)//总数为奇数
{
return find(A.begin(),m,B.begin(),n,total/2 + 1);
}
else//总数是偶数
{
return (find(A.begin(),m,B.begin(),n,total/2) + find(A.begin(),m,B.begin(),n,total/2 + 1))/2.0;
}
}
private:
static int find(vector<int>::const_iterator A,int m,vector<int>::const_iterator B,int n,int k)
{
if(m > n)
{
return find(B,n,A,m,k);
}
if(m == 0)
{
return *(B +k -1);
}
if(k == 1)
{
min(*A,*B);
}
int ia = min(k/2,m),ib = k -ia;
if(*(A +ia - 1) < *(B + ib - 1))
{
return find(A + ia,m - ia,B,n,k - ia);
}
else if(*(A +ia - 1) > *(B + ib - 1))
{
return find(A,m,B + ib,n - ib,k - ib);
}
else
{
return A[ia - 1];
}
}
};