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

力扣295. 数据流的中位数

优先队列

  • 思路:
    • 中位数是排序中间的数值:S1.M.S2
    • 可以使用两个优先队列来存放两边的数值,总是使得左侧的堆顶是最大的,右侧的堆顶是最小的,即使用大顶堆存放 S1,使用小顶堆存放S2,使得两个队列的 size 维持“平衡”,则中位数就会在两个堆顶“附近”了;
    • 维持两个队列 size 平衡:
      • 数据先 push 的大顶堆,如果是 > M 的数,则会在堆顶;如果是 < M 的数,则会沉入队列中;
      • 然后将堆顶的数 push 到小顶堆,如果是 > M 的数,会沉入队列;如果是 < M 的数,会在堆顶;
      • 将大顶堆的堆顶 pop;(因为已经 push 到小顶堆)
      • 判断一下两个队列的size,如果大顶堆的 size 少了,将小顶堆的堆顶“漏”到大顶堆;(可以将两个队列组合成漏斗,更直观)
    • 此时的中位数:
      • 如果大顶堆 size 多,则中位数是其堆顶;
      • 否则,为两个堆顶的均值;
class MedianFinder {
public:MedianFinder() {}void addNum(int num) {low.push(num);high.push(low.top());low.pop();if (low.size() < high.size()) {low.push(high.top());high.pop();}}double findMedian() {if (low.size() > high.size()) {return low.top();}return (low.top() + high.top()) / 2.0;}private:std::priority_queue<int, std::vector<int>, std::less<int>> low;std::priority_queue<int, std::vector<int>, std::greater<int>> high;
};/*** Your MedianFinder object will be instantiated and called as such:* MedianFinder* obj = new MedianFinder();* obj->addNum(num);* double param_2 = obj->findMedian();*/

http://www.lryc.cn/news/253559.html

相关文章:

  • 英语二笔记
  • 【OpenSSH升级】升级后证书认证登录突然失效
  • pytest +uiautomator2+weditor app自动化从零开始
  • 【计算机网络笔记】物理层——信道与信道容量
  • 深度学习火车票识别系统 计算机竞赛
  • C++EasyX之井字棋
  • 12.5_黑马数据结构与算法Java
  • 【PID学习笔记 5 】控制系统的性能指标之一
  • HarmonyOS学习--TypeScript语言学习(三)
  • Matlab 镜像变换(2D)
  • SpringBoot3-快速体验
  • 计数问题(数位DP)
  • SQL Server事务(Transaction)
  • Python语言基础学习大纲(由某大模型生成)
  • nodejs+vue+微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐
  • 工业机器视觉megauging(向光有光)使用说明书(十二,轻量级的visionpro)
  • HarmonyOS学习--了解基本工程目录
  • JRT导出协议实现
  • Unity中动态合批
  • 逆水行舟!浅谈24届双非本科秋招
  • vue3请求代理proxy中pathRewrite失效
  • 练习题——-【学习补档】日期差值
  • 面试问题 --文件描述符和流
  • 离线安装Zabbix的MariaDB报Error: Package: 1:mariadb-server-5.5.68-1.el7.x86 64异常解决方法
  • 【go语言开发】go项目打包成Docker镜像,包括Dockerfile命令介绍、goctl工具生成
  • Python:可以做什么?
  • Lookup Argument简史
  • 【unity3D】Transform组件(如何访问和获取Transform组件)
  • 单实例应用程序
  • Qlik 成为网络犯罪的焦点