大致思路:一边遍历一边比较大小,哪个小就把那个数组向后挪一位,直到到达中间位置为止,期间需要随时注意是否有哪个数组已经到头了。
数据的总个数是奇数还是偶数?如果是奇数个,则直接返回中间位置的那个数即可;如果是偶数个,则需要返回 中间数和前一个数的均值,这里用一个长度为2的小队列mids[2]保存数据。
void num_in(int *mids, int num)
{
mids[0] = mids[1];
mids[1] = num;
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
{
if(!nums1Size && !nums2Size)
return 0;
int i = 0, i1 = 0, i2 = 0;
int mids[2] = {0, 0};
int mid = (nums1Size + nums2Size) / 2 + 1;
while(i != mid)
{
if((i1 != nums1Size) && (i2 != nums2Size))
{
if(nums1[i1] < nums2[i2])
num_in(mids, nums1[i1++]);
else
num_in(mids, nums2[i2++]);
}
else if(i2 == nums2Size)
num_in(mids, nums1[i1++]);
else if(i1 == nums1Size)
num_in(mids, nums2[i2++]);
i++;
}
if((nums1Size + nums2Size) % 2) //奇数个
return (double)mids[1];
else //偶数个
return ((double)mids[0]+(double)mids[1]) / 2;
return 0;
}