给定两个大小为 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力解法,不满足题设条件。不推荐
使用map,存储nums1和nums2中所有数字。 k为数字 v为次数
然后看总长度为奇数还是偶数。
若是奇数,寻找长度%2+1的位置,循环遍历map中的v,直到找到中位数位置即退出。
偶数类似。
本题主要利用了map自动排序的特效。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int count=nums1.size()+nums2.size();
double ans=0,middleNum=0;
map<int,int> m;
for(int i=0;i<nums1.size();i++)
m[nums1[i]]++;
for(int i=0;i<nums2.size();i++)
m[nums2[i]]++;
map<int,int>::iterator it;
int i=0;
if(count%2==0)
{
middleNum=count/2;
cout<<"middleNum"<<middleNum<<endl;
for(it=m.begin();it!=m.end();it++)
{
int k=0;
for(int j=1;j<=it->second;j++)
{
++i;
cout<<"i "<<i<<endl;
if(i==middleNum||i==(middleNum+1))
{
ans+=it->first;
k++;
}
}
if(k==2)
break;
}
}else
{
middleNum=count/2+1;
for(it=m.begin();it!=m.end();it++)
{
for(int j=1;j<=it->second;j++)
{
++i;
if(i==middleNum)
{
return it->first;
}
}
}
}
return ans/2;
}
};