劍指offer 資料流中的中位數(思維,堆)

2021-10-06 10:09:33 字數 773 閱讀 2390

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