给定两个大小分别为 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
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
解题思路:
1.先开辟一个内存为两个数组大小之和的空间。
int *nums=(int*)malloc(sizeof(int)*(nums1Size+nums2Size));
2.先对两个数组同时进行遍历,对两个数组的值进行比较,较小值存入答案数组中。
while(i<nums1Size&&j<nums2Size) {
if(nums1[i]<nums2[j]) {
nums[k]=nums1[i];
i++;
}else{
nums[k]=nums2[j];
j++;
}
k++;
}
3.若有其中一个数组先被遍历完之后,则讲另一个数组剩下的值直接存入答案数组中。
if(i==nums1Size){
while(j<nums2Size){
nums[k]=nums2[j];
j++;
k++;
}
}else{
while(i<nums1Size){
nums[k]=nums1[i];
i++;
k++;
}
}
4.判断答案数组长度k为奇数还是偶数,若为奇数,则中位数为下标为k/2的数;若为偶数,则中位数为下标为k/2与k/2-1的数的平均值。
if(k%2) midnum=nums[k/2];
else midnum=(nums[k/2]+nums[(k/2)-1])/2.0;
完整代码如下:
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int i,j,k;
double midnum=0;
int *nums=(int*)malloc(sizeof(int)*(nums1Size+nums2Size));
i=j=k=0;
while(i<nums1Size&&j<nums2Size) {
if(nums1[i]<nums2[j]) {
nums[k]=nums1[i];
i++;
}else{
nums[k]=nums2[j];
j++;
}
k++;
}
if(i==nums1Size){
while(j<nums2Size){
nums[k]=nums2[j];
j++;
k++;
}
}else{
while(i<nums1Size){
nums[k]=nums1[i];
i++;
k++;
}
}
if(k%2) midnum=nums[k/2];
else midnum=(nums[k/2]+nums[(k/2)-1])/2.0;
return midnum;
}