解法:数据结构
一种解法是使用两个优先级堆:一个大根堆,存放小于中位数的值,以及一个小根堆存放大于中位数的值。这会将全部元素大体分为两半,中间的两个元素位于两个堆的堆顶。这样一来,要找到中位数就是小事一桩。dom
不过,“大体分为两半”又是什么意思呢?“大体”的意思是,若是有奇数个值,其中一个堆就会多一个值。经观察可知,如下两点为真。函数
若是maxHeap.size()>minHeap.size(),则maxHeap.top为中位数。spa
若是maxHeap.size()==minHeap.size(),则maxHeap.top()和minHeap.top()的平均值为中位数。设计
当要从新平衡这两个堆时,咱们会确保maxHeap必定会多一个元素。get
//老是保证大根堆的元素大于等于小根堆的 void addNewNumber(int randomNumber) { //当大根堆的元素和小根堆的元素相等时 if(maxHeap.size()==minHeap.size()) { if((minHeap.peek()!=NULL&&randomNumber>minHeap.peek())//此时应该将元素插入小根堆,可是要保证大根堆的元素大于等于小根堆,因此将小根堆这最小的元素插入大根堆,而后将该元素插入小根堆 maxHeap.offer(minHeap.poll()); minHeap.offer(randomNumber); } else { maxHeap.offer(randomNumber); } } else //大根堆的元素大于小根堆,直接将元素插入小根堆 { if(randomNumber<maxHeap.peek()) { minHeap.offer(maxHeap.poll()); maxHeap.offer(randomNumber); } else { minHeap.offer(randomNumber); } } } double getMedian() { if(maxHeap.isEmpty()) { return 0; } if(maxHeap.size()==minHeap.size()) { return (double)(minHeap.peek()+maxHeap.peek())/2; } else return maxHeap.peek(); }