题目

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2,找出并返回这两个正序数组的  。中位数

解题思路

这道题我们如果使用C语言,很自然的就会想道口利用内存管理和指针来解题,分步骤如下:

  • 开辟动态内存
  • 往开辟的内存中有序存放2个数组的元素
  • 元素是偶数个 -> 取动态内存中间2个数的平均值,返回它
  • 元素是奇数个 -> 取动态内存中间数,返回它


代码实现

#include <stdlib.h>
#include <stdio.h>

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {

    int* arr = NULL;
    double midNum = 0;
    int sumSize = 0;
    int i = 0;
    int j = 0;
    int k = 0;

    sumSize = nums1Size + nums2Size;

    arr = malloc(sizeof(int) * (nums1Size + nums2Size));
    if(arr == NULL)
    {
        perror("Memory allocation failed");
        return 0;
    }

    while(i < nums1Size && j < nums2Size)
    {
        if(nums1[i] <= nums2[j])
        {
            *(arr + k) = nums1[i];
            i++;
            k++;        
        }
        else
        {
            *(arr + k) = nums2[j];
            j++;
            k++;
        }
    }

    //存剩下的数
    if(i == nums1Size)
    {
        while(j < nums2Size)
        {
            *(arr + k) = nums2[j];
            j++;
            k++;
        }
    }
    else
    {
        while(i < nums1Size)
        {
            *(arr + k) = nums1[i];
            i++;
            k++;
        }
    }

    //数组是偶数
    if(sumSize % 2 == 0)
    {
        midNum = (*(arr + (sumSize / 2)) + *(arr + (sumSize / 2) - 1)) / 2.0;
    }
    else
    {
        midNum = *(arr + (sumSize / 2));
    }

    free(arr);
    arr = NULL;

    return midNum;
}