如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
最開始的思路就是用map或者set儲存。習慣寫python就想直接用median的key去訪問median,但是c++ stl的map或者set沒有key這個東西,如果用迭代器那麼訪問元素複雜度是o(n)
看到很多解法是用兩個堆來做,乙個最大堆,乙個最小堆,一開始不理解。後來發現這樣的好處是把資料總體切分為兩部分,一部分(最大堆)所有元素都比另一部分(最小堆)小。然後當有新元素需要insert的時候,根據現有元素總數奇偶,決定先壓入哪個堆,然後彈出乙個元素,彈出元素放入另乙個堆。
最後的答案處理,根據元素總數奇偶,決定從兩個堆分別取還是從特定的那個取。
class solution
else
}double getmedian()
else
return median;
}private:
multiset> maxs;
multiset> mins;
};
劍指offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。實現 public class getmediannum listnode in new listnod...
劍指Offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路整理 這個題目要解出來很簡單,但是這裡有乙個比較好的思路 用最大和最小堆來實現,就像乙個沙漏一樣,上...
劍指offer 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。資料流中的資料需要用合...