实际上使用两个队列,保证每个队列顶部恰好是中间的两个值(若large大小大于small,则说明奇数个数字,large的顶部是中间值)...保证 这个利用preority queue始终有序的特性...只需保证large的大小永远大于等于small,每次将最小的数给small;而small存数的负数形式(使得顶部最小元素即为实际的最大元素),每次将最大的值给large....这样large中始终存储大得那一半,small中是小的那一半,且二者的顶部最小值恰好是待求得median
class MedianFinder {
// Adds a number into the data structure.
Queue<Long> small = new PriorityQueue(),
large = new PriorityQueue();
public void addNum(int num) {
large.add((long)num);
small.add(-large.poll());
if( large.size()<small.size() )
{
large.add(-small.poll());
}
}
// Returns the median of current data stream
public double findMedian() {
if( large.size()>small.size() )
{
return large.peek();
}
return (double)((large.peek()-small.peek())/2.0);
}
};
// Your MedianFinder object will be instantiated and called as such:
// MedianFinder mf = new MedianFinder();
// mf.addNum(1);
// mf.findMedian();