[LeetCode] Find Median from Data Stream
2015-11-04 16:43
295 查看
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:
Design a data structure that supports the following two operations:
For example:
add(1)
add(2)
findMedian() -> 1.5
add(3)
findMedian() -> 2
Java:
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();
相关文章推荐
- UIPageControl分页控件多图实现
- 杭电ACM 1030 Delta-wave java代码解析
- 安卓注解编程 Support Annotations 详解
- 异常
- Java编程 的动态性,第 2部分: 引入反射
- 安全参透之旅第3章 OWASP工具使用
- 【转】iOS开发—SQLite的简单使用
- 计算机主机网关的作用是什么?
- 生死门问题
- DAG 上的动态规划(训练指南—大白书)
- JS中document.createElement()的用法
- Java关键字final、static使用总结
- 【iOS开发】设置TabBarItem上文字跟图片一样的颜色
- AlertDialog对话框
- 张小丫第一次微信支付(讲解)
- MongoDB 查询非空数组
- js实现可拉伸移动的div
- javascript设计模式-学习笔记
- Linux负载均衡概念与实践(一)
- c语言学习之基础知识点介绍(十四):指针的进阶