第四题:寻找两个正序数组的中位数
- 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数
示例 1:
- 输入:nums1 = [1,3], nums2 = [2]
- 输出:2.00000
- 解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
- 输入:nums1 = [1,2], nums2 = [3,4]
- 输出:2.50000
- 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
- 输入:nums1 = [0,0], nums2 = [0,0]
- 输出:0.00000
示例 4:
- 输入:nums1 = [], nums2 = [1]
- 输出:1.00000
示例 5:
- 输入:nums1 = [2], nums2 = []
- 输出:2.00000
提示:
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
- -106 <= nums1[i], nums2[i] <= 106
解题:
/**
* @file 4.cpp
* @author HarkerYX
* @brief 寻找两个正序数组的中位数
* @version 0.1
* @date 2021-04-26
*
* @copyright Copyright (c) 2021
*
*/
/*
第四题:寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数
解题思路:
两个数组的大小/2 算下标,判断奇偶
要考虑特殊情况,一个为空,一个有但是个数只有1个的情况
*/
#include <stdio.h>
#include <windows.h>
/**
* @brief
*
* @param nums1
* @param nums1Size
* @param nums2
* @param nums2Size
* @return double
*/
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
// 中位数是偶数情况下,结果是下标数两数和/2 : (n-1 + n)/2
// 中位数是奇数情况下,结果是下标数: n
double midRet = 0.0;
int midSize = (nums1Size + nums2Size) / 2;
// 第一个数组是空情况
if(nums1Size == 0){
// 一个数组个数是0情况下, midSize要根据情况计算
if(nums2Size <=2){
midSize = 1;
midRet = (double)nums2[midSize-1];
}
else if(midSize%2 == 0)
midRet = (double)(nums2[midSize - 1] + nums2[midSize]) / 2;
else
midRet = (double)nums2[midSize];
return midRet;
}
// 第二个数组是空情况
if(nums2Size == 0){
// 一个数组个数是0情况下, midSize要根据情况计算
if(nums1Size <=2){
midSize = 1;
midRet = (double)nums1[midSize-1];
}
else if(midSize%2 == 0)
midRet = (double)(nums1[midSize - 1] + nums1[midSize]) / 2;
else
midRet = (double)nums1[midSize];
return midRet;
}
// 两数组都不为空情况下
// 动态创建2个数组大小的数组,比较合成一个有序的大数组
// 题目条件是2个从小到大排序好的数组,这个比较好
int * newArry = (int *)malloc(sizeof(int)*(nums1Size + nums2Size));
int i = 0, j = 0, countSize = 0 ;
while(countSize < (nums1Size + nums2Size))
{
//循环比较大小合成大数组 , 这里 <= >= 有相等值的情况
if(nums1[i] <= nums2[j]){
newArry[countSize] = nums1[i];
i++;
}else if(nums1[i] >= nums2[j]){
newArry[countSize] = nums2[j];
j++;
}
countSize++;
//处理当一个数组完成,另外数组还没有,直接把没有完成的数组后面的数据直接依次放到大数组
if(i == nums1Size)
{
//第二个数组还有数据
while(j != nums2Size){
newArry[countSize] = nums2[j];
j++;
countSize++;
}
}else if(j == nums2Size)
{
//第一个数组还有数据
while(i != nums1Size){
newArry[countSize] = nums1[i];
i++;
countSize++;
}
}
}
//计算中位数
if(midSize%2 == 0)
midRet = (double)(newArry[midSize - 1] + newArry[midSize]) / 2;
else
midRet = (double)newArry[midSize];
return (double)midRet;
}
int main(void)
{
int num1[] = {1,3};
int num2[] = {2};
// int num1[] = {1,2};
// int num2[] = {3,4};
// int num1[] = {0,0};
// int num2[] = {0,0};
// int num1[] = {};
// int num2[] = {1};
// int num1[] = {1};
// int num2[] = {};
double ret = 0;
int size1 = sizeof(num1) / sizeof(int);
int size2 = sizeof(num2) / sizeof(int);
if(size1==0 && size2 ==0)
{
printf("输入的2个数组不对\n");
return -1;
}
ret = findMedianSortedArrays(num1,size1,num2,size2);
printf("中位数是: %lf\n",ret);
return 0;
}
中位数是: 2.000000