数据流中的中位数

2018/10/21 Offer 共 878 字,约 3 分钟

title

problem link

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

solution

public class Solution {
    private PriorityQueue<Integer> minP=new PriorityQueue<>();
    private PriorityQueue<Integer> maxP=new PriorityQueue<>((x,y)->(y-x));
    public void Insert(Integer num) {
        if(minP.isEmpty()||num>minP.peek()){
            minP.add(num);
        }else{
            maxP.add(num);
        }
        if(minP.size()==maxP.size()+2){
            maxP.add(minP.poll());
        }
        if(maxP.size()==minP.size()+1){
            minP.add(maxP.poll());
        }
    }

    public Double GetMedian() {
        if(minP.size()==maxP.size()){
            return (double)(minP.peek()+maxP.peek())/2
        }else{
            return (double)minP.peek();
        }
    }

    public static void main(String[] args) {
        PriorityQueue<Integer> priorityQueue=new PriorityQueue<>((x,y)->(y-x));
        priorityQueue.add(3);
        priorityQueue.add(4);
        System.out.println(priorityQueue.poll());
    }
}

Search

    Table of Contents