题目描述:
给定两个大小为 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)
{
if(nums1.size()==0)//如果第一个数组没数据,那么第二个数组的中位数就是这个题的答案
{
if(nums2.size()%2==1)
{
return nums2[nums2.size()/2];
}
else
{
double qq=nums2[nums2.size()/2-1];
double rr=nums2[nums2.size()/2];
return (qq+rr)/2;
}
}
if(nums2.size()==0)//如果第二个数组没数据,那么第一个数组的中位数就是这个题的答案
{
if(nums1.size()%2==1)
{
return nums1[nums1.size()/2];
}
else
{
double qq=nums1[nums1.size()/2-1];
double rr=nums1[nums1.size()/2];
return (qq+rr)/2;
}
}
double mid;
int n=nums1.size()+nums2.size();
int *arr=new int[n];
int k=0;
int i=0;
int j=0;
while( i<nums1.size() && j<nums2.size() )//准备合并数组
{
if ( nums1[i]<=nums2[j] )//从小到大排序一次进入新数组
{
arr[k]=nums1[i];
i++;
}
else
{
arr[k]=nums2[j];
j++;
}
k++;
}
if( i<nums1.size() ) //如果第一个数组的数据全部放入新的数组,但是第二个数组还有剩余,那么把剩余的部分放入
{
while( i<nums1.size() )
{
arr[k]=nums1[i];
i++;
k++;
}
}
if(j<nums2.size())//同理放入第二个数组的剩余部分
{
while(j<nums2.size())
{
arr[k]=nums2[j];
j++;
k++;
}
}
if( n%2==1)
{
mid=arr[n/2];
}
else
{
double cc=arr[n/2-1];
double dd=arr[n/2];
mid=(cc+dd)/2;
}
return mid;
}
};