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

【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.dtcms.com/a/304143.html

相关文章:

  • Day23-二叉树的层序遍历(广度优先搜素)
  • React 图标库发布到 npm 仓库
  • 试用SAP BTP 02C:试用SAP HANA Schemas HDI Containers
  • 构建特定领域的大模型
  • OV IP证书如何满足PCI DSS要求
  • 网络通信基础(一)
  • 第十六章 Java基础-拼图小游戏
  • 测试自动化不踩坑:4 策略告别 “为自动化而自动化”
  • BERT和GPT和ELMO核心对比
  • vue3插槽详解
  • Python之禅
  • mac 字体遍历demo
  • 《林景媚与命运解放者》
  • OpenCV 学习探秘之四:从角点检测,SIFT/SURF/ORB特征提取,目标检测与识别,Haar级联分类人脸检测,再到机器学习等接口的全面实战应用与解析
  • MySQL(配置)——MariaDB使用
  • 2025北京师范大学数学分析考研试题
  • 15-C语言:第15~16天笔记
  • FreeRTOS在中断上下文中设置事件组,调度很慢的的解决方法
  • 智慧工地系统:科技如何重塑建筑现场?
  • macOS “Sploitlight“漏洞曝光:攻击者可窃取Apple Intelligence缓存数据
  • 用动态的观点看加锁
  • 新升级超值型系列32位单片机MM32G0005
  • C++类中动态内存分配注意手册
  • python新手,学习计划
  • 每日一题7.29
  • 当贝纯净版_海信ip811n海思mv320处理器安卓4.42及9.0主板优盘免拆刷机固件及教程
  • [Token]ALGM: 基于自适应局部-全局token合并的简单视觉Transformer用于高效语义分割, CVPR2024
  • 安卓逆向2-安卓刷机和获取root权限和安装LSPosed框架
  • 博物馆 VR 导览:图形渲染算法+智能讲解技术算法实现及优化
  • 想要批量提取视频背景音乐?FFmpeg 和转换器都安排上