lintcode 1: Data Stream Median
2015-12-08 20:24
295 查看
Data Stream Median
Numbers keep coming, return the median of numbers at every time a new number added.Have you met this question in a real interview?
Example
For numbers coming list:
[1, 2, 3, 4, 5], return
[1, 1, 2, 2, 3].
For numbers coming list:
[4, 5, 1, 3, 2, 6, 0], return
[4, 4, 4, 3, 3, 3, 3].
For numbers coming list:
[2, 20, 100], return
[2, 2, 20].
Challenge
Total run time in O(nlogn).
Clarification
What's the definition of Median?
- Median is the number that in the middle of a sorted array. If there are n numbers in a sorted array A, the median is
A[(n - 1) / 2]. For example, if
A=[1,2,3], median is
2. If
A=[1,19], median is
1.
[思路]
用两个堆, max heap 和 min heap. 维持两个堆的大小相等(max堆能够比min堆多一个). 则max堆的顶即为median值.
[CODE]
public class Solution { /** * @param nums: A list of integers. * @return: the median of numbers */ public int[] medianII(int[] nums) { // write your code here if(nums==null) return null; int[] res = new int[nums.length]; PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11, new Comparator<Integer>() { @Override public int compare(Integer x, Integer y) { return y-x; } }); res[0] = nums[0]; maxHeap.add(nums[0]); for(int i=1; i<nums.length; i++) { int x = maxHeap.peek(); if(nums[i] <= x) { maxHeap.add(nums[i]); } else { minHeap.add(nums[i]); } if(maxHeap.size() > minHeap.size()+1 ) { minHeap.add(maxHeap.poll()); } else if(maxHeap.size() < minHeap.size()) { maxHeap.add(minHeap.poll()); } res[i] = maxHeap.peek(); } return res; } }
相关文章推荐
- 千兆以太网规范
- 面向对象-----代码练习(以水杯为例)
- 北大OJ1002
- 扫雷2
- Android如何反编译APK与资源文件
- 地理编码与反地理编码
- Windows程序设计--创建第一个窗口
- Java实现从数据库导出大量数据记录并保存到文件的方法(转)
- Sqlite3
- 北大OJ1001
- c++侵入式对象计数设计技术
- Codeforces Round #302 (Div. 2) A. Set of Strings
- Multi-Exemplar Affinity Propagation
- 使用Decision Tree对MNIST数据集进行实验
- JavaScript 系列笔记(一)数据类型
- servlet容器的URL映射知识
- 如何在Linux中查看所有正在运行的进程
- [Android]本地广播的好处
- print float as int 的分析
- 简易的 WebView 拦截事件等