给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
一、合并方法
最简单的方法就是将两个数组合并到另一个数组当中,再在这个数组中找到中位数即可。使用for循环将两个数组合并的方法考虑的情况较复杂 ,可以直接使用while循环将其中一个数组合并,那么,接着再使用一个for循环将另一个数组中剩余的量存入即可。该方法空间复杂度为O(m+n),时间复杂度也是一样O(m+n)。
代码:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
const int m = nums1.size(), n = nums2.size(), half = (n + m) >> 1;
int n1 = 0, n2 = 0;
vector<int> res(n + m);
for (int k = 0, i = 0, j = 0; k < res.size(); ++k)
{
if (i < m && j < n)
{
n1 = nums1[i];
n2 = nums2[j];
if (n1 > n2)
{
res[k] = n2;
if (j < n)
j++;
}
else if (n1 <= n2)
{
res[k] = n1;
if (i < m)
i++;
}
continue;
}
if (n == j)
{
res[k] = nums1[i];
i++;
}
else if (m == i)
{
res[k] = nums2[j];
j++;
}
}
if ((n + m) % 2 == 0)
{
return (res[half - 1] + res[half]) / 2.0f;
}
return res[half];
}
代码优化:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
const int m = nums1.size(), n = nums2.size(), half = (n + m) >> 1;
int i = 0, j = 0, k = 0;
vector<int> res(n + m);
while (i < m && j < n)
{
res[k++] = nums1[i] > nums2[j] ? nums2[j++] : nums1[i++];
}
while (i < m)
{
res[k++] = nums1[i++];
}
while (j < n)
{
res[k++] = nums2[j++];
}
if ((n + m) % 2 == 0)
{
return (res[half - 1] + res[half]) / 2.0f;
}
return res[half];
}