-
3.17
-
先加左边
-
不用判断是否左边大于右边,因为左边一定大于右边,要一直保持左至少等于右边(左边可以多)
-
返回时如果是左边多,则返回左边最大的
-
2.17
- 先加个左边,在给右边,再平衡
- 给出中位数(看是不是左边多一个)
-
2.3
class MedianFinder {
// 左边的堆:存较小的一半 -> 需要最大值 -> 大顶堆
private PriorityQueue<Integer> leftHeap;
// 右边的堆:存较大的一半 -> 需要最小值 -> 小顶堆
private PriorityQueue<Integer> rightHeap;
public MedianFinder() {
leftHeap = new PriorityQueue<>((a, b) -> b - a); // 降序
rightHeap = new PriorityQueue<>(); // 升序
}
public void addNum(int num) {
// 先往左边放,选个老大哥出来
leftHeap.offer(num);
// 把左边的老大哥扔到右边去当小弟
rightHeap.offer(leftHeap.poll());
// 平衡:规定左边可以比右边多 1 个,但不能少
if (leftHeap.size() < rightHeap.size()) {
leftHeap.offer(rightHeap.poll());
}
}
public double findMedian() {
if(leftHeap.size()>rightHeap.size()){
return leftHeap.peek();
}else{
return (leftHeap.peek()+rightHeap.peek())/2.0;
}
}
}// ...
}