Data Stream Median
Written on October 27, 2015
Tweet
Numbers keep coming, return the median of numbers at every time a new number added.
public class Solution {
/**
* @param nums: A list of integers.
* @return: the median of numbers
*/
public int[] medianII(int[] nums) {
int[] result = new int[nums.length];
PriorityQueue<Integer> min = new PriorityQueue<Integer>();
PriorityQueue<Integer> max = new PriorityQueue<Integer>(10, Collections.reverseOrder());
for (int i = 0; i < nums.length; i++) {
if (max.isEmpty() || nums[i] < max.peek()) {
max.offer(nums[i]);
} else {
min.offer(nums[i]);
}
if (min.size() > max.size()) {
max.offer(min.poll());
}
if (max.size() > min.size() + 1) {
min.offer(max.poll());
}
result[i] = max.peek();
}
return result;
}
}
public class Solution {
/**
* @param nums: A list of integers.
* @return: the median of numbers
*/
public int[] medianII(int[] nums) {
// write your code here
int[] result = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
result[i] = helper(nums, 0, i, i / 2 + 1);
}
return result;
}
public int helper(int[] nums, int start, int end, int med) {
int lo = start, hi = end, pivot = end;
while (lo <= hi) {
while (lo <= hi && nums[hi] >= nums[pivot]) hi --;
while (lo <= hi && nums[lo] < nums[pivot]) lo ++;
if (lo < hi) {
swap(nums, lo, hi);
lo ++;
hi --;
}
}
swap(nums, lo, pivot);
if (med == lo + 1) {
return nums[lo];
} else if (med > lo + 1) {
return helper(nums, lo + 1, end, med);
} else {
return helper(nums, start, lo - 1, med);
}
}
public void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
}