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 isA[(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].

Solution: Two balanced heap.

public int[] medianII(int[] nums) {
    int[] res = new int[nums.length];
    if(nums == null || nums.length == 0) {
        return res;
    }
    int median = nums[0];
    PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
    PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(nums.length, Collections.reverseOrder());
    for(int i = 0; i < nums.length; i++) {
        if(i != 0) {
            if(median > nums[i]) {
                maxHeap.offer(nums[i]);
            }
            else {
                minHeap.offer(nums[i]);
            }
        }
        if (minHeap.size() < maxHeap.size()) {
            minHeap.offer(median);
            median = maxHeap.poll();
        }
        else if(maxHeap.size() + 1 < minHeap.size()) {
            maxHeap.offer(median);
            median = minHeap.poll();
        }
        res[i] = median;
    }    
    return res;
}

results matching ""

    No results matching ""