63 劍指offer 資料流中的中位數

2022-08-24 01:09:11 字數 862 閱讀 9478

題目描述

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

解題思路:分為兩種情況,奇數取中間的數字,偶數取中間兩個數的平均值。

使用兩個堆來實現,左側使用最大堆儲存小的數字,右側使用最小堆儲存大的數字。

在插入時,

1)如果為偶數,則插入最小堆,且如果插入的數比最大堆中最大的數還小,則該數應插入最大堆,然後調整最大堆,找出此時最大堆中最大的插入最小堆,然後調整最小堆。

2)如果為奇數,則插入最大堆,如果此數比最小堆中最小的還大,則應插入最小堆,然後調整最小堆,將最小堆中最小的插入最大堆。

在取結果時,分為奇數和偶數,奇數取min[0](因為偶數時,插入到最小堆,插入完為奇數,此時最小堆比最大堆多乙個),偶數取平均值

1

class

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 方法獲取當前讀取資料的中位數。首先要理解題目,對於乙...