[LeetCode] Find Median from Data Stream

Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value.

Examples:
[2,3,4] , the median is 3

[2,3], the median is (2 + 3) / 2 = 2.5

Design a data structure that supports the following two operations:

  • void addNum(int num) - Add a integer number from the data stream to the data structure.
  • double findMedian() - Return the median of all elements so far.
    For example:

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

解题思路

使用两个priority_queue来模拟两个堆,其中的一个大根堆minH用来存储较大的那一半元素,另一个小根堆maxH用来存储较小的那一半元素。则,中位数要么是其中一个堆(元素较多的堆)的top元素,要么是两个堆的top元素的均值。

实现代码

C++:

// Runtime: 212 ms
class MedianFinder {
public:
    // Adds a number into the data structure.
    void addNum(int num) {
       minH.push(num);
       int n = minH.top();
       minH.pop();
       maxH.push(n);
       int len1 = maxH.size();
       int len2 = minH.size();
       if (len1 > len2)
       {
           n = maxH.top();
           maxH.pop();
           minH.push(n);
       }
    }

    // Returns the median of current data stream
    double findMedian() {
        int len1 = maxH.size();
        int len2 = minH.size();
        if (len1 == len2)
        {
            return (maxH.top() + minH.top()) / 2.0;
        }
        else
        {
            return len1 > len2 ? maxH.top() : minH.top();
        }
    }

private:
    priority_queue<int, vector<int>, less<int>> maxH;
    priority_queue<int, vector<int>, greater<int>> minH;
};

// Your MedianFinder object will be instantiated and called as such:
// MedianFinder mf;
// mf.addNum(1);
// mf.findMedian();

Java:

// Runtime: 50 ms
class MedianFinder {
    private Queue<Integer> maxH = new PriorityQueue<Integer>(Collections.reverseOrder());
    private Queue<Integer> minH = new PriorityQueue<Integer>();
    // Adds a number into the data structure.
    public void addNum(int num) {
        minH.offer(num);
        int n = minH.poll();
        maxH.offer(n);
        int len1 = maxH.size();
        int len2 = minH.size();
        if (len1 > len2) {
            n = maxH.poll();
            minH.offer(n);
        }
    }

    // Returns the median of current data stream
    public double findMedian() {
        int len1 = maxH.size();
        int len2 = minH.size();
        if (len1 == len2) {
            return (maxH.peek() + minH.peek()) / 2.0;
        }
        else {
            return len1 > len2 ? maxH.peek() : minH.peek();
        }
    }
};

// Your MedianFinder object will be instantiated and called as such:
// MedianFinder mf = new MedianFinder();
// mf.addNum(1);
// mf.findMedian();
时间: 2024-09-26 06:06:39

[LeetCode] Find Median from Data Stream的相关文章

Interprocess communication - 1 data stream

当进程间可以共享数据, 并且可以等待其他进程是否执行完毕时, 程序将变得更加强大. 显然共享数据和等待都是内部进程通信的范畴, 这里主要讲一下 data stream. 每个进程都有一个descriptor table, 这个表包含了file descriptor(a number) 和 data stream的映射关系. 如图 :  A file descriptor is a number that represents a data stream. 默认会有3条映射关系, 0, 1 , 2

LeetCode 4 Median of Two Sorted Arrays

翻译 有两个给定的排好序的数组nums1和nums2,其大小分别为m和n. 找出这两个已排序数组的中位数. 总运行时间的复杂度应该是O(log(m+n)). 原文 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

&lt;font color=&quot;red&quot;&gt;[置顶]&lt;/font&gt;

Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸,本博客会持续更新,感谢您的支持,欢迎您的关注与留言.博客有多个专栏,分别是关于 Windows App开发 . UWP(通用Windows平台)开发 . SICP习题解 和 Scheme语言学习 . 算法解析 与 LeetCode等题解 . Android应用开发 ,而最近会添加的文章将主要是算法和Android,不过其它内容也会继续完善. About the Author 独立 Windows App 和

Video for Linux Two API Specification revision0.24【转】

转自:http://blog.csdn.net/jmq_0000/article/details/7536805#t136 Video for Linux Two API Specification Revision 0.24 Michael H Schimek             <mschimek@gmx.at>            Bill Dirks Hans Verkuil Martin Rubli Copyright 1999, 2000, 2001, 2002, 2003,

Video for Linux Two API Specification Revision 2.6.32【转】

转自:https://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html Video for Linux Two API Specification Revision 2.6.32 Michael H Schimek     <mschimek@gmx.at>    Bill Dirks Original author of the V4L2 API and documentation.

BDTC PPT集萃(一):BAT、华为、网易等分享的大数据架构

从2008年60人规模的"Hadoop in China"技术沙龙,到当下数千人规模的行业技术盛宴,七届BDTC(大数据技术大会)完整地见证了中国大数据技术与应用的变革,忠实地描绘了大数据领域内的技术热点,沉淀了无数极具价值的行业实战经验.同时,2014年12月12至14日,第八届中国大数据技术盛会将一如既往的引领当前领域内的技术热点,分享行业实战经验. 为了更好地洞悉行业发展趋势,了解企业技术挑战,在BDTC 2014召开前夕,我们将带大家一起对历届大会沉淀的知识进行挖掘,分享各IT

socket programming example

1. 头文件 vi server.h  // 头文件 // 注册信号处理函数 int catch_signal(int sig, void (*handler) (int)); // 从socket读数据到char *buf int read_in(int socket, char *buf, int len); // 错误函数, 当exit_val=0只输出错误信息, 不退出程序. 其他值输出错误信息并退出程序 void error(char * msg, int exit_val); //

Go语言:基于连接与组合的语言(上)

到目前为止,我做过不下于10次关于Go的讲座,大多数的主题都会与"设计哲学"这样的话题有关.之所 以这样,是因为我对自己的定位是Go语言的"传教士",而不是"培训师".我的出发点在于引起大家对Go的 关注与兴趣,至于如何去一步步学习Go语言的语法知识,我相信兴趣是最好的老师.现今我们学习的平台足够 强大,只要你真的很有兴趣,就一定能够学好Go语言. Go语言是非常简约的语言.简约的意思是少而 精.Go语言极力追求语言特性的最小化,如果某个语法特性