最大最小堆
时间复杂度 O(NlogN) 空间O(N) 维护一个最大堆,一个最小堆,最大堆存的是到目前为止较小的那一半数,
最小堆是到目前为止较大的那一半数
最大堆是目前为止较小的那一半数
最好在脑子里面形成一个图,这个图是这样的, 最大堆上面的元素是最大的,下面都是比堆顶元素要小,最小堆上的元素是最小的,说明堆顶元素以下都是比堆顶元素要大的。 这样的话,自然而然的就知道,最大堆 最小堆存储的元素,有什么不同。最重要的一点是要注意平衡堆的大小,最大堆和最小堆相差的size必须是在1以内的
注意2点
第一点:就是每次堆里面的元素入堆的时候,都必须判断最大堆和最小堆的大小
第二点:设计类的题目,注意要写构造函数
class MedianFinder {
PriorityQueue<Integer> maxheap;
PriorityQueue<Integer> minheap;
public MedianFinder(){
maxheap = new PriorityQueue<Integer>(11,new Comparator<Integer>(){
public int compare(Integer o1,Integer o2){
return o2-o1;
}
});
minheap = new PriorityQueue<Integer>();
}
// Adds a number into the data structure.
public void addNum(int num) {
if(maxheap.size()==0||num<=maxheap.peek()){
if(maxheap.size()>minheap.size()){
minheap.offer(maxheap.poll());
}
maxheap.offer(num);
}
else if(minheap.size()==0||num>minheap.peek()){
if(minheap.size()>maxheap.size()){
maxheap.offer(minheap.poll());
}
minheap.offer(num);
}
else{
if(maxheap.size()<=minheap.size()){
maxheap.offer(num);
}else{
minheap.offer(num);
}
}
}
// Returns the median of current data stream
public double findMedian() {
if(maxheap.size()>minheap.size()){
return maxheap.peek();
}else if(maxheap.size()<minheap.size()){
return minheap.peek();
}else if(maxheap.isEmpty()&&minheap.isEmpty()){
return 0;
}else{
return (maxheap.peek()+minheap.peek())/2.0;
}
}
};