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

【C++算法】77.优先级队列_数据流的中位数

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:


题目链接:

295. 数据流的中位数


题目描述:

6fe30b995012bbd4d8a604cf13047124


解法

解法一:直接sort(会超时)

来一个数就sort一下。通过元素个数找到下标和下标值来求中位数。

解法二:插入排序思想(会超时)

已经有一堆有序的数了,就从后往前扫描,把插入的数插进他合适的位置。

解法三:

大小堆来维护数据流中的中位数。

前面一半数存在大根堆(left堆),后面一半数存在小根堆(right堆)

左边一半元素放到大根堆,堆顶元素就是左边最右侧的元素。

右边一半元素放到小根堆,堆顶元素就是右边最左侧的元素。

e868c3fe1e10d9bd563adf65e9106aae

细节问题:add()

需要分类讨论,m== nm==n+1

  1. m== n

    • num<=x或者m==0num进入left
    • num>xnum进入right堆,然后把右边的堆顶元素y进入left
  2. m==n+1

    • num<=xnum进入left堆,然后把左边的堆顶元素x进入right
    • num>xnum进入right

3ffe5a122efdcfb319e820848770a056


C++ 算法代码:

class MedianFinder 
{// 维护两个堆:// left 是大根堆,保存较小的一半数据,堆顶是这些数中的最大值priority_queue<int> left;// right 是小根堆,保存较大的一半数据,堆顶是这些数中的最小值// 通过greater<int>比较器实现小根堆priority_queue<int, vector<int>, greater<int>> right;public:// 构造函数MedianFinder() {}// 添加新数字到数据流中void addNum(int num) {// 我们维护的不变量:// 1. left堆中的所有元素 <= right堆中的所有元素// 2. 两个堆的大小差不超过1// 情况1:两堆大小相等时,新元素要么进入left,要么进入right并调整if(left.size() == right.size()){if(left.empty() || num <= left.top()) // 如果新元素应该放入left{left.push(num);}else // 新元素应该放入right,但为了保持平衡,需要将right的最小值转移到left{right.push(num);left.push(right.top());right.pop();}}// 情况2:left比right多一个元素时else{if(num <= left.top()) // 如果新元素应该放入left,需要将left的最大值转移到right以保持平衡{left.push(num);right.push(left.top());left.pop();}else // 新元素大于left.top,直接放入right{right.push(num);}}// 添加结束后,我们始终保持:// 如果总数是偶数,left和right大小相等// 如果总数是奇数,left比right多一个元素}// 获取当前数据流的中位数double findMedian() {// 如果左右堆大小相等(总数为偶数),中位数是两个堆顶的平均值if(left.size() == right.size()) return (left.top() + right.top()) / 2.0;// 如果总数为奇数,中位数就是left堆顶(较小一半的最大值)else return left.top();}
};
http://www.xdnf.cn/news/16591.html

相关文章:

  • PHP云原生架构:容器化、Kubernetes与Serverless实践
  • 机器学习笔记(四)——聚类算法KNN、Kmeans、Dbscan
  • 深入理解 Qt 元对象系统 (Meta-Object System)
  • 架构实战——互联网架构模板(“用户层”和“业务层”技术)
  • 【Linux系统编程】Ext2文件系统
  • 【C++】指针
  • 【面试场景题】阿里云子账号设计
  • 【数据结构】用堆实现排序
  • JavaWeb 入门:JavaScript 基础与实战详解(Java 开发者视角)
  • 「源力觉醒 创作者计划」_文心大模型 4.5 多模态实测:开源加速 AI 普惠落地
  • 某雷限制解除:轻松获取原始下载链接,支持多任务转换
  • Hyperchain安全与隐私机制详解
  • Android Slices:让应用功能在系统级交互中触手可及
  • ElasticSearch 的3种数据迁移方案
  • RabbitMQ 消息持久化的三大支柱 (With Spring Boot)
  • 深度学习篇---百度AI Studio模型
  • JSON-RPC 2.0 规范
  • JVM知识点(2)
  • 二维经验模态分解(BEMD)算法详解与MATLAB实现
  • Python 程序设计讲义(28):字符串的用法——格式化字符串:format()方法
  • Spring Boot with RabbitMQ:四大核心模式指南
  • python-网络编程
  • PCIE4.0/5.0/DDR4/DDR5使用以及布局布线规则-集萃
  • RHCE综合项目:分布式LNMP私有博客服务部署
  • 【Lua】题目小练4
  • 【保姆级 - 大模型应用开发】DeepSeek R1 本地部署全攻略:Ollama + vLLM + PyTorch 多选方案
  • 【图像处理基石】如何对遥感图像进行实例分割?
  • 【LeetCode 热题 100】34. 在排序数组中查找元素的第一个和最后一个位置——二分查找
  • 宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署
  • Go 客户端玩转 ES|QL API 直连与 Mapping Helpers 实战详解