力扣网 4 寻找两个正序数组的中位数
题目描述
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m n))
。
示例 1:
代码语言:javascript复制输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
代码语言:javascript复制输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m n <= 2000
-106 <= nums1[i], nums2[i] <= 106
思路分析
最基本的思路,将两个数组重新排序到一个新的数组里,之后再求这个数组的中位数。
关于中位数的求法:
根据元素个数决定,如果个数为奇数,中间那个就是中位数,如果为偶数,则中间的和前一个元素的平均数就是中位数。
代码语言:javascript复制double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int j=0;
int i=0;
int q=0;
int k=0;
int arr[nums1Size nums2Size];
while(i<nums1Size||j<nums2Size)
{
if(i==nums1Size)
{
q=nums2[j ];//将要存放到新数组里的值先放到q里。
}
else if(j==nums2Size)
{
q=nums1[i ];
}
else if(nums1[i]<nums2[j])
{
q=nums1[i ];
}
else
{
q=nums2[j ];
}
arr[k ]=q;
}
int a=nums1Size nums2Size;
double n=0;
if(a==1)
{
return arr[a-1];
}
else
{
if(a%2==0)
{
int b=a/2;
n=(arr[b-1] arr[b])/2.0;//整除2.0转换为double型
}
else
{
int b=a/2;
n=arr[b]*1.0;
}
}
return n;
}