找中位数
核心思想是搞两个堆,然后让数字在里面流动,每个堆存放一半的数据,0~100的话,就是0~50在左边的堆,是一个大堆,而51~100则是在右边的堆,是一个小堆,然后当左边和右边数据一样多的时候,新的数据应该插入左边的堆,然后挤出一个左边的大数到右边,这样的话,奇数个数字的时候,右边堆顶就是中位数;如果左右数据不一样多,那肯定是右边的数据多,那么就插入右边的堆,把右边堆的数字挤出一个到左边去,中位数等于两个堆顶的和
https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/
import java.util.Comparator;
import java.util.PriorityQueue;
class MedianFinder {
private PriorityQueue<Integer> maxQueue = new PriorityQueue<>();//最大堆
private PriorityQueue<Integer> minQueue = new PriorityQueue<>(new Comparator<Integer>() {
@Override public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});//最小堆
/** initialize your data structure here. */
public MedianFinder() {
}
public void addNum(int num) {
if(maxQueue.size() == minQueue.size()) {
minQueue.add(num);
maxQueue.add(minQueue.poll());
} else {
maxQueue.add(num);
minQueue.add(maxQueue.poll());
}
}
public double findMedian() {
return minQueue.size() == maxQueue.size() ? (maxQueue.peek() + minQueue.peek()) / 2.0 : maxQueue.peek() ;
}
}
浙公网安备 33010602011771号