题目描述:
给定两个大小为m和n的正序(从小到大)数组nums1和nums2。
请找出这两个正序数组的的中位数,并要求算法的时间复杂度为O(log(m+n))。
可以假设nums1和nums2不会同时为空。
示例1:
nums1=[1,3]
nums2=[2]
则中位数是2.0
考虑到时间复杂度限制为log(m+n),首先是想到使用二分法找中位数。
不过没有空间限制,而且两个数组都是有序数组,所以还是采用了合成一个新的有序数组,再排序。
重构数组法1:C
简单来说就是重新申请一个新的数组空间,合并两个数组,然后在新的数组里找找中位数。
具体代码实现如下:
double findMedianSortedArrays(int* nums1,int nums1Size,int* nums2,int nums2Size)
{
//合并新的有序数组,找中位数
//时间O(m+n),空间O(m+n)
int *nums3=(int *)malloc(sizeof(int)*(nums1Size+nums2Size); //新的有序数组
int i=0,j=0,k=0; //i为nums1指针,j为nums2,k为nums3
//合并型数组
while(i<nums1Size&&j<nums2Size)
{
if(nums1[i]<=nums2[j])
nums3[k++]=nums1[i++]; //从小到大
else
nums3[k++]=nums2[j++];
}
//处理剩下的数
while(i<nums1Size)
{
nums3[k++]=nums1[i++];
}
while(j<nums2Size)
{
nums3[k++]=nums2[j++];
}
//找中位数
int len=nums1Size+nums2Size;
int midlen=len/2;
double mid=0;
if(len%2==0)
mid=(double)(nums3[midlen-1]+nums3[midlen])/2; //长度偶数
else
mid=nums3[midlen]; //长度奇数
return mid;
}
运行结果