STL栈、队列、堆的算法笔记(5)——【寻找中位数】

本文介绍了一种数据结构,能够动态地维护一组数据,并提供添加元素及返回中位数的功能。通过使用两个优先级队列,该数据结构能高效地处理奇数和偶数个数据的中位数计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

寻找中位数

题目:

设计一个数据结构,该数据结构动态维护一组数据,且支持如下操作:
1.添加元素: void addNum(int num),将整型num添加至数据结构中。
2.返回数据的中位数: double findMedian(),返回其维护的数据的中位数。
中位数定义:
1.若数据个数为奇数,中位数是该组数排序后中间的数。[1,2,3] -> 2
2.若数据个数为偶数,中位数是该组数排序后中间的两个数字的平均值。[1,2,3,4] -> 2.5

解题图解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题代码:

// 寻找中位数.cpp 
#include <iostream>
#include<queue>
using namespace std;
class Median
{
public:
	double getMedian() {
		if (big_queue.size()==small_queue.size())
		{
			return (double)(big_queue.top() + small_queue.top()) / 2;
		}
		else if (big_queue.size() > small_queue.size()) {
			return big_queue.top();
		}
		return small_queue.top();
	}
	void addNum(int num) {
		if (big_queue.empty())
		{
			big_queue.push(num);
			return;
		}
		if (big_queue.size() == small_queue.size()) {
			if (big_queue.top()>num)
			{
				big_queue.push(num);
			}
			else {
				small_queue.push(num);
			}
		}
		else if (big_queue.size() > small_queue.size())
		{
			if (big_queue.top()<num)
			{
				small_queue.push(num);
			}
			else {
				small_queue.push(big_queue.top());
				big_queue.pop();
				big_queue.push(num);
			}
		}
		else if (big_queue.size() < small_queue.size()) {
			if (small_queue.top() < num)
			{
				big_queue.push(small_queue.top());
				small_queue.pop();
				small_queue.push(num);
			}
			else {
				big_queue.push(num);
			}
		}
	}
private:
	priority_queue<int> big_queue;
	priority_queue<int, vector<int>, greater<int>> small_queue;
};
int main()
{
	Median median;
	median.addNum(3);
	median.addNum(7);
	median.addNum(12);
	median.addNum(8);
	double m = median.getMedian();
	cout << m << endl;
}

谢谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值