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

LeetCode 295. 数据流的中位数(C++)*

思路:
1.使用数组来实现存储,但是对于数组来说,重新排列数组时间复杂度高,效率低
2.为了提高效率,需要高效率的可排列元素的容器:优先队列;使用使用两个优先队列来实现小大根堆存储前后半部分数据。根据队列尺寸来调整两队列中的元素。
原题链接:https://leetcode.cn/problems/find-median-from-data-stream/description/?favorite=2ckc81c

1.题目如下:

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。

例如 arr = [2,3,4] 的中位数是 3 。
例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。
实现 MedianFinder 类:

MedianFinder() 初始化 MedianFinder 对象。

void addNum(int num) 将数据流中的整数 num 添加到数据结构中。

double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

示例 1:

输入
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
输出
[null, null, null, 1.5, null, 2.0]

解释
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1); // arr = [1]
medianFinder.addNum(2); // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3); // arr[1, 2, 3]
medianFinder.findMedian(); // return 2.0

提示:

-105 <= num <= 105
在调用 findMedian 之前,数据结构中至少有一个元素
最多 5 * 104 次调用 addNum 和 findMedian

2.代码如下:

class MedianFinder {
public:
    //小根堆和大根堆
    priority_queue<int, vector<int>, less<int>> queMin;
    priority_queue<int, vector<int>, greater<int>> queMax;
/*
    该题的重点是如何存储属数据方便存取中位数;
*/
//思路一:使用有序数组来实现存储,但是对于数组来说,重新排列数组时间复杂度高,效率低
//思路二:为了提高效率,使用使用两个优先队列来实现大根堆存储数据,对数据自动排序
/*
    对排序过的元素如何判断中位数;队列无法进行随机存储;
    通过两个优先队列来实现,将前后半部分元素分开
*/
    MedianFinder() {
        
    }
    
    void addNum(int num) {
        // 注意判断为空条件在先
        if(queMin.empty() || num<=queMin.top() ){
            queMin.push(num);
            //维持两队列平衡,小根堆元素不能大于大根堆超过1
            if(queMin.size()>queMax.size()+1){
                int temp=queMin.top();
                queMax.push(temp);
                queMin.pop();
            }
        }
        else{
            queMax.push(num);
            //设定大根堆的元素应该比小根堆小1or相等
            if(queMax.size()>queMin.size()){
                int temp=queMax.top();
                queMin.push(temp);
                queMax.pop();
            }
        }
    }
    
    double findMedian() {
        if(queMin.size()>queMax.size()){
            return queMin.top();
        }
        return (queMax.top()+queMin.top())/2.0;
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */
http://www.dtcms.com/a/662.html

相关文章:

  • MySQL表的增删查改
  • 完全二叉树与堆(包含STL堆的用法)
  • 用HTML写一个2023跨年动画代码(烟花+自定义文字+背景音乐+雪花+倒计时)
  • Electron打包图标不显示解决方案
  • Synchronized锁原理及 ConcurrentHashMap
  • OpenCV学习
  • 【位图】面对海量数据,如何压缩空间?定位数据?
  • 【Linux】进程创建、终止、等待、替换、shell派生子进程的理解…
  • 《L1 - 5分合集总结》
  • CSAPP Shell Lab
  • 13.0、Linux-安装Tomcat、以及防火墙常用命令
  • html实现酷炫的公司年会抽奖(附源码)
  • 自定义启动器
  • QT 学习笔记(十七)
  • 光敏二极管血氧仪方案设计研发
  • 【Kotlin】标准库函数 ③ ( with 标准库函数 | also 标准库函数 )
  • elementui el-table表格实现翻页和搜索均保持勾选状态(后端分页)
  • 内含JAVA简单概括和JAVA所需安装的软件和详细教程,想学习JAVA无从下手,这篇文章带你迈出第一步
  • C++——类和对象1
  • 转到结构化写作后的几点变化
  • 数据分析师:星图Stagraph 2.1 Crack
  • 【前端修炼场】— table 表格的构建
  • 计算机网络(二)Linux网络编程
  • FPGA基础之modelsim常见问题
  • java蛋糕店蛋糕商城蛋糕系统网站源码
  • C++的集合和映射
  • 机器学习笔记之深度信念网络(二)模型构建思想(RBM叠加结构)
  • JavaScript面试题
  • 前端项目-小米商城
  • 零基础如何入门网络安全?2023年最新,建议收藏!