给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
方法一:将两个数组合并并排号
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int nums1Size = nums1.size(); //nums1的长度
int nums2Size = nums2.size();//nums2的长度
int numsSize = nums1Size + nums2Size; //总的长度
int b = int(numsSize/2)+1; //新建数组的长度 只求中位数的话不需要将numsSize的长度 只需b
double a;//返回结果
vector<int> newnums(b); //新建的数组
//新数组的构建
for(int i =0,j = 0, k = 0; i < b; i++)
{
if(j == nums1Size) //如果nums1数组的数 排完
{
newnums[i] = nums2[k];
k++;
continue;
}
if(k == nums2Size) // 如果nums2数组的数排完
{
newnums[i] = nums1[j];
j++;
continue;
}
if(nums1[j] >= nums2[k]) //如果都没有排完 按比较大小的结果来排
{
newnums[i] = nums2[k];
k++;
continue;
}
else
{
newnums[i] = nums1[j];
j++;
continue;
}
}
//找到中位数 如果其中一位为空另一个长度
if (numsSize == 1)
{
if (nums1Size == 1)
{
a = nums1[0];
return a;
}
else
{
a = nums2[0];
return a;
}
}
else if(numsSize%2 == 1)
{
int pos = (numsSize - 1 )/2;
a = newnums[pos];
return a;
}
else
{
int pos = numsSize / 2;
a = (double(newnums[pos-1])+double(newnums[pos]))/2;
return a ;
}
}
};
方法二:采用vecto库函数
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
nums1.insert(nums1.end(),nums2.begin(),nums2.end());
sort(nums1.begin(),nums1.end());
int len = nums1.size();
if(len%2==0)
{
return((double)(nums1[len/2-1])+(double)(nums1[len/2]))/2;
}
return nums1[len/2];
}
};