LeetCode 4_寻找两个正序数组的中位数(c++实现)

问题:
给定两个大小为 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;
}

调试结果为:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值