【中位数】对顶堆维护

基本思路

    让大根堆的元素<=mid
    让小根堆的元素 > mid 

显然如果个数是奇数个,大根堆数量要比小根堆多1

否则取出两堆堆顶元素求平均数

P1168 中位数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

板子题

#include<bits/stdc++.h>

using ll = long long;
using ull = unsigned long long;
using ari = std::array<int, 3>;
using PII = std::pair<int, int>;

const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const double eps = 1e-6;
#define int ll
int n,k;
int a[N];
void solve() {
	std::cin>>n;
	std::priority_queue<int> d;//默认大根堆 
	std::priority_queue<int,std::vector<int>,std::greater<int> > s;
	
//	让大根堆的元素<=mid
//	让小根堆的元素>mid 
	int mid=INT_MIN;
	for(int i=1;i<=n;i++)
	{
		std::cin>>a[i];
		
		if(i==1) mid=a[1];
		if(a[i]<=mid)
		{
			d.push(a[i]); 
		}else s.push(a[i]);
		
		if(i%2)
		{
			while((int)d.size()-(int)s.size()<1)
			{
				d.push(s.top());
				s.pop();
			}
			while((int)d.size()-(int)s.size()>1)
			{
				s.push(d.top());
				d.pop();
			}
			mid=d.top();
			std::cout<<mid<<'\n';
		}
	} 
}
signed main() {
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);

    int t = 1;
    //std::cin>>t;
    while (t--) {
        solve();
    }

    return 0;
}

295. 数据流的中位数 - 力扣(LeetCode)

对顶堆 

对奇数个偶数个都求中位数 

class MedianFinder {
public:
    std::priority_queue<int> l;//默认大根堆 
	std::priority_queue<int,std::vect
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值