中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2

针对该问题,由于数组是动态增加的,我们使用传统的查找中位数的方式为:有序数组取中间两位(奇数个数字,取中间一位数字;偶数个数字,取中间两个数字的平均值),那么每次我们增加一个数字就需要重新排序,代价太大

此时我们可以维护两个堆,最大堆存储较小元素,最小堆存储较大元素,且两个堆大小相差不能超过1;此时,我们仅需要每次调整两个堆的堆顶元素即可。

计算中位数时,根据两个堆各自的大小,分别取堆顶进行计算求值。该过程就是会出现重建堆较为耗时(O(nlogn))之外再没有需要消耗时间的地方了

实现如下:

class MedianFinder {public:/** initialize your data structure here. */MedianFinder() { }void addNum(int num) {if (big_heap.empty()) {big_heap.push(num);} else {//当最大堆元素个数大于最小堆元素个数,此时需要向最小堆插入if(big_heap.size() > small_heap.size()) { //但是发现插入的元素 小于 最大堆的元素个数//规则是:最小堆堆顶元素一定大于最大堆的堆顶,所以需要调整最大堆堆顶if (num < big_heap.top()) {small_heap.push(big_heap.top());big_heap.pop();big_heap.push(num);} else {small_heap.push(num);}} else {if (num > small_heap.top()) {big_heap.push(small_heap.top());small_heap.pop();small_heap.push(num);} else {big_heap.push(num);}}}}double findMedian() {if (big_heap.size() > small_heap.size()) {return big_heap.top();} else if (big_heap.size() == small_heap.size()) {return (double)(big_heap.top() + small_heap.top()) / 2.0;} else {return small_heap.top();}}
private:priority_queue<int, vector<int>, greater<int>> small_heap;priority_queue<int, vector<int>, less<int>> big_heap;
};

leetcode-295 数据流的中位数相关推荐

  1. LeetCode 295. 数据流的中位数 Hard难度

    295. 数据流的中位数 题目: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 ...

  2. Leetcode 295. 数据流的中位数

    1.题目要求 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个 ...

  3. LeetCode 295. 数据流的中位数(大小堆)

    文章目录 1. 题目 2. 大小堆解题 1. 题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 ...

  4. 76. Leetcode 295. 数据流的中位数 (堆-技巧一-固定堆)

    技巧一 - 固定堆这个技巧指的是固定堆的大小 k 不变,代码上可通过每 pop 出去一个就 push 进来一个来实现.而由于初始堆可能是0,我们刚开始需要一个一个 push 进堆以达到堆的大小为k,因 ...

  5. 295. 数据流的中位数

    295. 数据流的中位数 欢迎大家参加每日一题系列并提供其他版本,在你也可以按照相同格式提供你的最新的每日一题题解. 每日一题系列 题目描述: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是 ...

  6. [LeetCode][C++]数据流的中位数

    数据流的中位数 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一 ...

  7. 【leetcode】数据流的中位数

    一.题目描述 中位数是有序整数列表中的中间值.如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值. 例如 arr = [2,3,4] 的中位数是 3 . 例如 arr = [2,3] 的中 ...

  8. 力扣—— 295. 数据流的中位数(困难)

    目录 题目描述 问题分析 c++代码 题目描述 问题分析 使用大小堆来完成: 我们让最大堆总是大于最小堆一个量或者等于最小堆数量,中位数只可能是最大堆顶或最大堆与最小堆堆顶平均值. c++代码 cla ...

  9. LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现)

    1. 题目 中位数是有序序列最中间的那个数. 如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) ...

  10. LeetCode 703. 数据流中的第K大元素(优先队列)

    1. 题目 设计一个找到数据流中第K大元素的类(class). 注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...

最新文章

  1. 折返(Reentrancy)VS线程安全(Thread safety)
  2. 学数学或物理学到 high 很刺激,是一种怎样的经历与感受?
  3. Openlayers中点击地图获取坐标并输出
  4. Django的jinja2语法遇到jquery问题: defaultaddress is not defined
  5. SAP CRM读取产品主数据360度数据的API
  6. 自定义EventSource(一)EventCounter
  7. linux中检测用户信息的命令是,在Linux系统上检查用户所属组
  8. Participate in E-sports【Java大数+二分】
  9. mysql基本功能+show+innodb+索引+慢sql+explain
  10. Java 9 关注度不断上升!2018 编程语言流行度大调查
  11. matlab无穷积分求解_matlab编程求无穷限定积分
  12. 室内定位无GPS怎么办?阿木送来解决方案~
  13. 0030-用OpenCV的inpaint函数做图像的污点修复
  14. 货拉拉客户端通用日志组件 - Glog
  15. python数组内运算_Python数组介绍和操作运算详解
  16. 08 量子力学教材推荐,量子力学书单:量子力学、高等量子力学、量子统计、量子信息、路径积分...(适合物理专业本科生、研究生、物理爱好者)
  17. MD5加密是什么?为什么不可解密?
  18. JavaScript基本原理常识
  19. 每日加瓦,终成栋房4-final、内部类、权限修饰符
  20. 非华为手机可以刷鸿蒙系统吗,非华为手机用户,你愿意尝试鸿蒙系统吗?

热门文章

  1. HTML页面加载和解析流程详细介绍
  2. maven nexus 3 third party 构件上传
  3. 监听指定端口数据交互(HttpListenerContext )
  4. C/C++流程图生成器 C转流程图【worldsing笔记】
  5. SQL Server 数据库备份
  6. C++Primer学习笔记(二)
  7. OpenCV+python:Canny边缘检测算法
  8. axure动态登录和html5,Axure8原型设计实战案例:如何实现登录功能?
  9. 对于数据库进行设计在PHP,关于数据库表的设计
  10. java 多选列表框_快逸报表:填报中的下拉多选列表框