解法:數據結構
一種解法是使用兩個優先級堆:一個大根堆,存放小於中位數的值,以及一個小根堆存放大於中位數的值。這會將全部元素大體分爲兩半,中間的兩個元素位於兩個堆的堆頂。這樣一來,要找到中位數就是小事一樁。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(); }