问题:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
程序设计如下:
首先将两个数组压入同一个vector完成合并,利用sort进行排序,然后寻找中位数,如果合并后数组size为偶数,则返回size/2与size/2-1两个元素的平均,如果合并后数组size为奇数,则返回下标为size-1/2的元素。
#include <iostream>
#include <vector>
#include<algorithm>
#include<iomanip>
using namespace std;
class input_output//在此类中实现两个数组的输入,并提供一个获得中位数的函数接口,具体功能在子类中实现
{
public:
bool input();
bool combine();
virtual float get_med()=0;
vector<int> vec1;
vector<int> vec2;
vector<int> combine_vec;
};
bool input_output::input()
{
int temp;
cout<<"请输入vec1大小:"<<endl;
int size1;
cin >> size1;
cout<<"请输入"<<size1<<"个元素:"<<endl;
for(int i=0;i<size1;i++)
{
cin>>temp;
vec1.push_back(temp);
}
cout<<"请输入vec2大小:"<<endl;
int size2;
cin >> size2;
cout<<"请输入"<<size2<<"个元素:"<<endl;
for(int j=0;j<size2;j++)
{
cin>>temp;
vec2.push_back(temp);
}
return true;
}
bool input_output::combine()
{
for(int i=0;i<vec1.size();i++)
{
combine_vec.push_back(vec1[i]);
}
for(int j=0;j<vec2.size();j++)
{
combine_vec.push_back(vec2[j]);
}
return true;
}
class get_median:public input_output
{
public:
float get_med();
};
float get_median::get_med()
{
sort(combine_vec.begin(),combine_vec.end());
cout<<"合并排序后的数组为:"<<endl;
for(int k=0;k<combine_vec.size();k++)
{
cout<<combine_vec[k]<<" ";
}
cout<<endl;
if(combine_vec.size()%2==0)
{
return (float)(combine_vec[combine_vec.size()/2]+combine_vec[combine_vec.size()/2-1])/2;
}
if(combine_vec.size()%2==1)
{
return (float)(combine_vec[(combine_vec.size()-1)/2]);
}
}
int main()
{
float temp;
get_median aa;
aa.input();
aa.combine();
temp=aa.get_med();
cout<<"中位数为:";
cout<<setiosflags(ios::fixed)<<setprecision(1)<<temp<<endl;
system("pause");
return 0;
}
调试结果为: