题目
给定两个大小分别为 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;
}