给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 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
//思路:
//1、将两个数组合并为一个数组
//2、 将合并后的数组排序
//3、折中,分为奇书和偶数分别求中位数
//思路:
//1、将两个数组合并为一个数组
//2、 将合并后的数组排序
//3、折中,分为奇书和偶数分别求中位数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size);
int main()
{
int nums1[10];
int nums2[10];
int m=0,n=0;
char c=' ';
char d=' ';
while(c!='\n')//用读入字符判断是否输入结束
{
scanf("%d",&nums1[m]);
c = getchar();
m++;
}
while(d!='\n')
{
scanf("%d",&nums2[n]);
d = getchar();
n++;
}
printf("%.5f",findMedianSortedArrays(nums1,m,nums2,n));
return 0;
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int nums3[nums1Size+nums2Size];//要多少空间,就开多少空间
int i,j,t,z;
double h;
int m=nums1Size,n=nums2Size;
//合并两个数组
for(i=0;i<m;i++)
{
nums3[i]=nums1[i];
}
for(j=m+n-1;j>=m;j--)
{
nums3[j]=nums2[j-m];
}
//将合并的数组进行排序:冒泡
for(j=0;j<m+n;j++)
for(i=0;i<m+n-j-1;i++)
{
if(nums3[i]>nums3[i+1])
{
t=nums3[i];
nums3[i]=nums3[i+1];
nums3[i+1]=t;
}
}
//折中,分为奇书和偶数分别求中位数
if((m+n)%2!=0)
{
z=(m+n)/2;
return (double)nums3[z];
}
else
{
z=(m+n)/2;
return (double)(nums3[z]+nums3[z-1])/2;
}
}