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].

  • [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;
    }
}

results matching ""

    No results matching ""