class MedianFinder {
public static void main(String[] args) {
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1);
// System.out.println(medianFinder.findMedian());
medianFinder.addNum(4);
System.out.println(medianFinder.findMedian());
medianFinder.addNum(3);
System.out.println(medianFinder.findMedian());
medianFinder.addNum(5);
System.out.println(medianFinder.findMedian());
medianFinder.addNum(2);
}
/** initialize your data structure here. */
private int count;
private PriorityQueue<Integer> minHeap;
private PriorityQueue<Integer> maxHeap;
public MedianFinder() {
count = 0;
minHeap = new PriorityQueue<>((n1,n2)->n1-n2);
maxHeap = new PriorityQueue<>((n1,n2)->n2-n1);
}
public void addNum(int num) {
++count;
maxHeap.offer(num);
minHeap.add(maxHeap.poll());
if((count & 1)!=0){
maxHeap.add(minHeap.poll());
}
}
public double findMedian() {
if ((count & 1) == 0) {
// 如果两个堆合起来的元素个数是偶数,数据流的中位数就是各自堆顶元素的平均值
return (double) (maxHeap.peek() + minHeap.peek()) / 2;
} else {
// 如果两个堆合起来的元素个数是奇数,数据流的中位数大顶堆的堆顶元素
return (double) maxHeap.peek();
}
}
}
leet295:数据流的中位数
最新推荐文章于 2023-01-22 22:04:45 发布