Descripition:
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3],nums2 = [2],The median is 2.0.
Example 2:
nums1 = [1, 2],nums2 = [3, 4],The median is (2 + 3)/2 = 2.5.
分析:这道题就是找两个已经排序的数组的中位数。思路还算比较简单,我们可以想象将两个数组合成一个数组,然后再求合成的数组的中位数就很简单了。不过我们不需要组成一个新的数组,只需要按照同样的方式遍历,麻烦的是没有合成数组如何保存中位数(1个数或者2个数的平均数)。
代码如下:
class Solution{
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len = nums1.size() + nums2.size();
int i = 0, j = 0, k = 0;
double ret = 0.0; //用于存储结果
int flag = (len % 2) ? 1 : 0; //用于判断中位数是一个数还是两个数
while( (i < nums1.size() || j < nums2.size()) && k < (len - 1) / 2 + 2)
{
while(k < (len - 1) / 2 + 2 && i < nums1.size() && (j == nums2.size() || nums1[i] <= nums2[j]))
{
if(k >= (len - 1) / 2 && flag < 2) //如果中位数是一个数,只加一次;如果是两个数,加两次.
{
ret += nums1[i];
++flag;
}
++i, ++k;
}
while(k < (len - 1) / 2 + 2 && j < nums2.size() && (i == nums1.size() || nums1[i] > nums2[j]))
{
if(k >= (len - 1) / 2 && flag < 2)
{
ret += nums2[j];
++flag;
}
++j, ++k;
}
}
return (len % 2) ? ret : ret / 2;
}
};