///使用大根堆和小根堆
//第一个数 存在大根堆中
//如果当前数 大于等于 大根堆栈顶 加入大根堆 否则加入小根堆
//比较两个根堆的size 如果差别超过2 就将大size()的顶部弹出 放到小的size()中
//如果两个堆最后size 一样 :中位数 就是两个堆顶相加除2
//否则就是多的那个堆顶
class MedianFinder {
PriorityQueue<Integer> minHeap;
PriorityQueue<Integer> maxHeap;
public MedianFinder() {
minHeap=new PriorityQueue<>((o1,o2)->{return o1-o2;});
maxHeap=new PriorityQueue<>((o1,o2)->{return o2-o1;});
}
public void addNum(int num) {
if(maxHeap.size()==0&&minHeap.size()==0){
maxHeap.add(num);
return;
}
if(num<=maxHeap.peek()){
maxHeap.add(num);
}else{
minHeap.add(num);
}
if(maxHeap.size()-minHeap.size()>=2){
minHeap.add(maxHeap.poll());
}
if(minHeap.size()-maxHeap.size()>=2){
maxHeap.add(minHeap.poll());
}
}
public double findMedian() {
if(maxHeap.size()>minHeap.size()){
return maxHeap.peek()*1.0;
}else if(maxHeap.size()<minHeap.size()){
return minHeap.peek()*1.0;
}else{
return (maxHeap.peek()+minHeap.peek())/2.0;
}
}
}