如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
解題思路:
假設我們已經有數字 1 2 3 4 5 6 7 8,那麼我們可以把前半部分的4個數字做乙個大堆big,後4個數字做乙個小堆small。然後(big.top()+small.top())/2即為答案。這兩個堆我們允許它們之間的容量相差為1。同時small的最小值大於big的最大值。
很自然地,我們想到的維護方法是:每次insert乙個數字時候,我們檢查big.top(),假如比big.top()大的話,big.insert(num),假如比small.top()小的話,small.insert(num),否則我們可以在兩個堆中的容量較小的堆insert. 注意每次insert後,我們都需要檢查兩個堆的大小,假如有乙個堆比另乙個堆的size大2,我們就從大size的堆把數字pop出來給小size的堆。
class solution
if(!pq_big.size())
return;
}if(numpq_small.size()+1)
return;
}if(pq_small.size()pq_big.size())return pq_small.top();
else return pq_big.top();}}
};
劍指offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。實現 public class getmediannum listnode in new listnod...
劍指Offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路整理 這個題目要解出來很簡單,但是這裡有乙個比較好的思路 用最大和最小堆來實現,就像乙個沙漏一樣,上...
劍指offer 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。資料流中的資料需要用合...