给定两个大小分别为 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
傻瓜算法(硬解)
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
{
int k=0;
int s[nums2Size+nums1Size];
for(int i=0;i<nums1Size+nums2Size;i++)
{
if(i<nums1Size)
s[i]=nums1[i];
else
s[i]=nums2[k++];
}
for(int i=0;i<nums2Size+nums1Size;i++)
{
for(int j=1+i;j<nums2Size+nums1Size;j++)
{
if(s[i]>s[j])
{
int temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
}
if((nums1Size+nums2Size)%2!=0)
return (double)s[(nums2Size+nums1Size)/2];
else
return (double)(s[(nums2Size+nums1Size)/2]+s[(nums2Size+nums1Size)/2-1])/2;
}
另可以在合并数组时进行排序,大大节省时间,代码也简单许多,
另
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
{
int p1 = 0, p2 = 0;
int sorted[m + n];
int cur;
while (p1 < m || p2 < n) {
if (p1 == m) {
cur = nums2[p2++];
} else if (p2 == n) {
cur = nums1[p1++];
} else if (nums1[p1] < nums2[p2]) {
cur = nums1[p1++];
} else {
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
if((nums1Size+nums2Size)%2!=0)
return (double)sorted[(nums2Size+nums1Size)/2];
else
return (double)(sorted[(nums2Size+nums1Size)/2]+sorted[(nums2Size+nums1Size)/2-1])/2;
}