大根堆+小根堆
class MedianFinder {
private PriorityQueue<Integer> maxHeap;
private PriorityQueue<Integer> minHeap;
public MedianFinder() {
//大根堆
maxHeap = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer i1,Integer i2){
return i2.compareTo(i1);
}
});
//小根堆
minHeap = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer i1,Integer i2){
return i1.compareTo(i2);
}
});
}
public void addNum(int num) {
if(maxHeap.size() == 0 || num <= maxHeap.peek())
maxHeap.offer(num);
else
minHeap.offer(num);
makeblance();
}
public void makeblance(){
if(maxHeap.size() == minHeap.size() + 2){
minHeap.offer(maxHeap.poll());
}
else if(maxHeap.size() + 1== minHeap.size()){
maxHeap.offer(minHeap.poll());
}
}
public double findMedian() {
int k = maxHeap.size() + minHeap.size();
return k % 2 == 0 ? ((double) maxHeap.peek() + minHeap.peek()) / 2 : maxHeap.peek();
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/