106. 动态中位数经典 / 对顶堆

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了106. 动态中位数经典 / 对顶堆相关的知识,希望对你有一定的参考价值。


用对顶堆来维护。一个大根堆,一个小根堆。
大根堆存前一半的数据,小根堆存后一半的数据。
需要满足这样的一个条件:

  • 大根堆最大的数<=小根堆最小的数
  • 大根堆的数量最多比小根堆的数量多1,这样大根堆的堆顶就是中位数
#include<bits/stdc++.h>
using namespace std;
int t,id,n;
int main(void)

    cin>>t;
    while(t--)
    
        cin>>id>>n;
        printf("%d %d\\n",id,(n+1)/2);
        priority_queue<int>maxv_heap;//存前一半数据
        priority_queue<int,vector<int>,greater<int>> minv_heap;//存后一半数据
        
        int cnt=0;
        for(int i=1;i<=n;i++)
        
            int x; cin>>x;
            if(maxv_heap.empty() || x<=maxv_heap.top()) maxv_heap.push(x);
            else minv_heap.push(x);
            
            if(maxv_heap.size()>minv_heap.size()+1) 
                minv_heap.push(maxv_heap.top()),maxv_heap.pop();
            if(maxv_heap.size()<minv_heap.size())
                maxv_heap.push(minv_heap.top()),minv_heap.pop();
            if(i&1)
            
                printf("%d ",maxv_heap.top());
                cnt++;
                if(cnt&&(cnt%10==0)) puts("");
            
            
        
        if(cnt%10) puts("");
    
    return 0;

以上是关于106. 动态中位数经典 / 对顶堆的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 面试题 17.20. 连续中值 | 对顶堆维护动态中位数

hdu3282 链表或者对顶堆

对顶堆与应用

P1168 中位数(对顶堆)

中位数 对顶堆

uoj#280[UTR #2]题目难度提升 对顶堆+STL-set