題目描述
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值
解題思路:分為兩種情況,奇數取中間的數字,偶數取中間兩個數的平均值。
使用兩個堆來實現,左側使用最大堆儲存小的數字,右側使用最小堆儲存大的數字。
在插入時,
1)如果為偶數,則插入最小堆,且如果插入的數比最大堆中最大的數還小,則該數應插入最大堆,然後調整最大堆,找出此時最大堆中最大的插入最小堆,然後調整最小堆。
2)如果為奇數,則插入最大堆,如果此數比最小堆中最小的還大,則應插入最小堆,然後調整最小堆,將最小堆中最小的插入最大堆。
在取結果時,分為奇數和偶數,奇數取min[0](因為偶數時,插入到最小堆,插入完為奇數,此時最小堆比最大堆多乙個),偶數取平均值
1class
solution
18//
插入最小堆
19min.push_back(num);
20 push_heap(min.begin(),min.end(),greater());21}
22else
//插入左側(最大堆)
2332
//插入最大堆
33max.push_back(num);
34 push_heap(max.begin(),max.end(),less());35}
36}3738
double
getmedian()
3947
else
4851
}52 };
劍指offer 63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。為了保證插入新資料和取...
劍指offer63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。先排序後求解這樣能過 ...
劍指offer63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。首先要理解題目,對於乙...