核心思想是搞两个堆,然后让数字在里面流动,每个堆存放一半的数据,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() ; } }