Data Stream Median
Numbers keep coming, return the median of numbers at every time a new number added.
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, ifA=[1,2,3], median is2. IfA=[1,19], median is1.
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].
[x]
PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b) -> b - a);[x] ``` Comparator
revCmp = new Comparator () { @Override public int compare(Integer left, Integer right) { return right.compareTo(left); } }; int cnt = nums.length; maxHeap = new PriorityQueue<Integer>(cnt, revCmp); minHeap = new PriorityQueue<Integer>(cnt);```
[x]
Collections.reverseOrder());
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 || nums.length == 0) {
return nums;
}
int[] ans = new int[nums.length];
ans[0] = nums[0];
int index = 1;
int median = ans[0];
PriorityQueue<Integer> minPQ = new PriorityQueue<>();
PriorityQueue<Integer> maxPQ = new PriorityQueue<Integer>(nums.length, Collections.reverseOrder());
for (int i = 1; i < nums.length; i++) {
if (nums[i] > median) {
minPQ.offer(nums[i]);
}else{
maxPQ.offer(nums[i]);
}
//
if (maxPQ.size() == minPQ.size() || maxPQ.size() +1 == minPQ.size()){
ans[i] = median;
continue;
}else if (maxPQ.size() + 1 < minPQ.size()) {
maxPQ.offer(median);
median = minPQ.poll();
}else if (maxPQ.size() > minPQ.size()) {
minPQ.offer(median);
median = maxPQ.poll();
}
ans[i] = median;
}
return ans;
}
}