主要思路是会用大顶堆和小顶堆,因为题意是保持排序,取中间值,刚好用两个堆来维持中间值。注意堆的更新
class MedianFinder {
/** initialize your data structure here. */
Queue<Integer> minQ,maxQ;
public MedianFinder() {
minQ = new PriorityQueue<>();
maxQ = new PriorityQueue<>((v1,v2) -> v2 - v1);
}
public void addNum(int num) {
if(minQ.size() != maxQ.size()){
minQ.add(num);
maxQ.add(minQ.poll());
}else {
maxQ.add(num);
minQ.add(maxQ.poll());
}
}
public double findMedian() {
if(minQ.size() != maxQ.size()){
return minQ.peek();
}else return (minQ.peek() + maxQ.peek()) / 2.0;
}
}
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder obj = new MedianFinder();
* obj.addNum(num);
* double param_2 = obj.findMedian();
*/