前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 295. 数据流的中位数(大小堆)

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

作者头像
Michael阿明
发布2020-07-13 15:41:25
5670
发布2020-07-13 15:41:25
举报

1. 题目

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

代码语言:javascript
复制
例如,
[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

进阶:
如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?
如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法?

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-median-from-data-stream

《剑指Offer》同题:面试题41. 数据流中的中位数 链接

2. 大小堆解题

参考我的博客 数据结构 堆(优先队列)

类似题目:

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

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

  • 建立大顶堆(存放数据中较小的部分),小顶堆(存放较大的部分)
  • 同时维护两个堆的大小相等或者大顶堆多一个
  • 那么两个堆的堆顶就是中间的数据,根据奇偶,输出堆顶
代码语言:javascript
复制
class MedianFinder {
	priority_queue<int> maxHeap;
	priority_queue<int,vector<int>,greater<int>> minHeap;
	int n = 0;//数据计数
public:
    MedianFinder() {}
    
    void addNum(int num) {
    	++n;
    	if(maxHeap.size() <= minHeap.size())
    	{
            if(maxHeap.empty() || num <= minHeap.top())
                maxHeap.push(num);
    		else//(num > minHeap.top())
    		{
    			maxHeap.push(minHeap.top());
    			minHeap.pop();
    			minHeap.push(num);
    		}    			
    	}
    	else// maxHeap.size() > minHeap.size()
    	{
    		if(num < maxHeap.top())
    		{
    			minHeap.push(maxHeap.top());
    			maxHeap.pop();
    			maxHeap.push(num);
    		}
    		else
    			minHeap.push(num);
    	}
    }
    
    double findMedian() {
        if(n%2 == 1)
        	return maxHeap.top();
        return (maxHeap.top()+minHeap.top())/2.0;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 大小堆解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档