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
用两个堆, max heap 和 min heap. 维持两个堆的大小相等(max堆能够比min堆多一个). 则max堆的顶即为median值.
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 isA[(n - 1) / 2]
. For example, if
A=[1,2,3]
, median is 2
. If A=[1,19]
, median is
1
.
[思路]
[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; } }