当前位置: 首页 > news >正文

【力扣hot100题】(075)数据流的中位数

一开始只建立了一个优先队列,每次查询中位数时都要遍历一遍于是喜提时间超限,看了答案才恍然大悟原来还有这么聪明的办法。

方法是建立两个优先队列,一个大根堆一个小根堆,大根堆记录较小的数,小根堆记录较大的数。

每次加入元素时首先和大根堆最大的数进行比较,若元素更小则加入大根堆,否则加入小根堆,接着比较大根堆小根堆的大小,若大根堆比小根堆大超过一个元素(默认元素总数为奇数时大根堆多一个元素),则将大根堆最大元素加入小根堆并从大根堆移除那个元素;若小根堆比大根堆大时同理。

找出中位数时若总数为偶数(大根堆小根堆大小相等),则取大根堆最大元素和小根堆最小元素相加除以二;若总数为奇数(大根堆多一个元素),则直接取大根堆最大的元素。

好聪明的办法!!

另外小根堆构造方法是priority_queue<int,vector<int>,greater<int>> minq;,其中greater是小元素在前的比较函数。(大根堆中这个函数是less<int>)

class MedianFinder {
public:
    priority_queue<int> maxq; //大根堆,记录较小的数
    priority_queue<int,vector<int>,greater<int>> minq; //小根堆,记录较大的数
    MedianFinder() {
    }
    
    void addNum(int num) {
        if(maxq.empty()||num<maxq.top()){
            maxq.emplace(num);
            if(maxq.size()>minq.size()+1){
                minq.emplace(maxq.top());
                maxq.pop();
            }
        }
        else{
            minq.emplace(num);
            if(minq.size()>maxq.size()){
                maxq.emplace(minq.top());
                minq.pop();
            }
        }

    }
    
    double findMedian() {
        if(maxq.size()==minq.size()) return (maxq.top()+minq.top())/2.0;
        else return maxq.top();
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */

相关文章:

  • 2025年3月GESPC++三级考级真题——2025
  • Elasticsearch 系列专题 - 第六篇:高级功能与生态系统
  • P8627 [蓝桥杯 2015 省 A] 饮料换购
  • Linux用户切换命令区别详解
  • 【JDBC-54】JDBC:Java数据库连接的桥梁与核心特性解析
  • 进度计划频繁变更,如何稳定推进
  • 【含文档+PPT+源码】基于微信小程序的小区物业收费管理系统
  • 【C++游戏引擎开发】第9篇:数学计算库GLM(线性代数)、CGAL(几何计算)的安装与使用指南
  • Windows下编译SALOME
  • spm12_fMRI 2*4混合方差分析 Flexible factorial 对比矩阵
  • 多模态大语言模型arxiv论文略读(十)
  • vue3 history路由模式刷新页面报错问题解决
  • 华宇TAS应用中间件与联奕科技多款软件产品完成兼容互认证
  • 机场跑道异物检测数据集VOC+YOLO格式33793张31类别
  • 位运算与实战场景分析-Java代码版
  • Ubuntu搭建Pytorch环境
  • 操作系统 4.4-从生磁盘到文件
  • 无法读取库伦值文件节点解决方案
  • 项目周期过长,如何拆分里程碑
  • 基于STM32 的实时FFT处理(Matlab+MDK5)
  • 帮别人做网站赚钱6/网店营销策划方案范文
  • 宜春seo网站推广/长沙靠谱seo优化
  • 衡水企业做网站推广/广告营销
  • 彩票推广网站如何做/百度引擎入口官网
  • 免费行情网站app大全下载/哪里有免费的网站推广
  • 彩票网站为啥链接做两次跳转/深圳搜索引擎优化seo