这是一道google的比较经典算法题,题目是:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如:x数组:1,7,9,10,30 y数组:3,5,8,11 则中间大数为:8
时间复杂度是logn,我们可以比较两个数组的中位数,然后根据中位数的关系来进行二分查找。在边界条件判断上,我们要注意奇偶情况,如果是偶数个元素的数组,我们需要取上中位数,因为偶数的数组的中位数是取得下界,所以在最终的结果会比实际中位数要小。
int middle(int* AS, int* AE, int * BS, int * BE, bool IsOdd)
{
int * Amid = (AS + (AE - AS) / 2);
int * Bmid = (BS + (BE - BS) / 2);
if(*Amid < *(Bmid - 1))
{
if(AE - Amid < BE - Bmid)
{
if(*AE <= *(Bmid - (AE - AS) / 2))
{
return *(Bmid - (AE - AS) / 2);
}
else
{
return middle(Amid, AE, Bmid - (AE - AS) / 2, Bmid,IsOdd);
}
}
else
{
if(*Amid +( BE - BS) / 2 <= *BS)
{
return *(Amid +( BE - BS)/2);
}
else
{
return middle(Amid, Amid +( BE - BS) / 2, BS, Bmid,IsOdd);
}
}
}
else if(*Amid > *(Bmid + 1))
{
if(AE - Amid < BE - Bmid)
{
if(*AE >= *(Bmid + (AE - AS) / 2))
{
return *(Bmid + (AE - AS) / 2);
}
else
{
return middle(AS, Amid, Bmid, Bmid + (AE - AS) / 2,IsOdd);
}
}
else
{
if(*Amid - ( BE - BS) / 2 >= *BS)
{
return *(Amid - ( BE - BS) / 2);
}
else
{
return middle(Amid, Amid - ( BE - BS) / 2, Bmid, BE,IsOdd);
}
}
}
else
{
if(IsOdd)
{
return *Amid<*Bmid?*Bmid:*Amid;
}
else
{
return *Amid<*Bmid?*Amid:*Bmid;
}
}
}