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(); } }
用最大堆和最小堆