4.两个排序数组的中位数

题目


思路
1.排除特殊情况(空数组或单一数组)
2.把两个数组合成新数组,新数组是有序的
代码

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    //简单情况
    if (nums1Size == 0 && nums2Size == 0)
    {
        return 0;
    }
    
    if (nums1Size == 0)
    {
        if (nums2Size % 2 == 0)
        {
            return (*(nums2 + nums2Size / 2) + *(nums2 + nums2Size / 2 -1)) / 2.0;
        }
        else
        {
            return *(nums2 + nums2Size / 2);
        }
    }
    
    if (nums2Size == 0)
    {
        if (nums1Size % 2 == 0)
        {
            return (*(nums1 + nums1Size / 2) + *(nums1 + nums1Size / 2 -1)) / 2.0;
        }
        else
        {
            return *(nums1 + nums1Size / 2);
        }
    }
    //i第1个数组计数,j第2个数组计数,k总计数
    int i = 0;
    int j = 0;
    int k = 0;
    //有序生成新数组
    double* mergedArray = (double*)malloc(sizeof(double) * (nums1Size + nums2Size));
    
    while((i <= nums1Size -1) && (j <= nums2Size - 1))
    {
        if (*(nums1 + i) < *(nums2 + j))
        {
            *(mergedArray + k) = *(nums1 + i);
            i++;
            k++;
        }
        else
        {
            *(mergedArray + k) = *(nums2 + j) ;
            j++;
            k++;
        }
    }
    
    while (i <= nums1Size -1)
    {
        *(mergedArray + k) = *(nums1 + i) ;
        i++;
        k++;
    }
    
    while (j <= nums2Size -1)
    {
        *(mergedArray + k) = *(nums2 + j) ;
        j++;
        k++;
    }
    //取中间数
    if ((nums1Size + nums2Size) % 2 == 0)
    {
        return (*(mergedArray + (nums1Size + nums2Size) / 2) + *(mergedArray + (nums1Size + nums2Size) / 2 - 1)) / 2.0;
    }
    else
    {
        return *(mergedArray + (nums1Size + nums2Size) / 2);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容