剑指 Offer 41. 数据流中的中位数

public MedianFinder() {

    }
    
    PriorityQueue<Integer> max = new PriorityQueue<>();
    PriorityQueue<Integer> min = new PriorityQueue<Integer>(11,new Comparator<Integer>(){ //大顶堆,容量11
        @Override
        public int compare(Integer i1,Integer i2){
            return i2-i1;
        }
    });
    public void addNum(int num) {
        if(min.isEmpty()){
            min.add(num);
        }else if(max.isEmpty()){
            if(num>min.peek()) max.add(num);
            else {
                max.add(min.poll());
                min.add(num);
            }
        }else if(min.size() == max.size()){
            if(num>max.peek()){
                min.add(max.poll());
                max.add(num);
            } else{
                min.add(num);
            }
        }else{
            if(num<min.peek()){
                max.add(min.poll());
                min.add(num);
            }else{
                max.add(num);
            }
        }

    }

    public double findMedian() {
        if(min.size()==0) return 0;
        if(min.size()==max.size()){
            return (min.peek()+max.peek())/2.0;
        }else{
            return min.peek();
        }
    }

用最大堆和最小堆

 

posted @ 2020-08-21 09:11  欣姐姐  阅读(95)  评论(0)    收藏  举报