劍指Offer 資料流中的中位數

2021-08-21 07:07:52 字數 714 閱讀 6084

題目描述:

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。

思路整理:這個題目要解出來很簡單,但是這裡有乙個比較好的思路:用最大和最小堆來實現,就像乙個沙漏一樣,上面是最小堆,下面是最大堆,當要加入的數是第奇個數的時候,就把它放到下面,但是不是直接放入最大堆中,而是先進入最小堆中過濾一下,這樣每次放入最大堆中的數肯定都是比最小堆中的小,同樣,當出現是偶數的數的時候,就把他先放入最大堆中過濾一下,然後再從最大堆中取出最大的數放入最小堆中,這樣就能保證,沙漏上面的數永遠都比下面的大,下面的數永遠都比上面小,而,下面中最大堆的棧頂又是下面多有資料中最大的,上面的最小堆的棧頂又是上面資料中最小的,這樣就能取到中位數了;

程式:

copy:

priorityqueueminhead=new priorityqueue<>();

priorityqueuemaxhead=new priorityqueue<>(new comparator()

});int index=0;

public void insert(integer num)

else

}public double getmedian()

劍指offer 資料流中的中位數

題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。實現 public class getmediannum listnode in new listnod...

劍指offer 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。資料流中的資料需要用合...

劍指offer 資料流中的中位數

題意 每次輸入乙個數字,輸出當前資料流的中位數。我也給出了main函式,含義就是類似的就是main函式中的例子。include 記住這句話,能夠包含所有標頭檔案 using namespace std class solution if p.top num else if p.size 2 q.si...