《劍指offer》 41 資料流中的中位數

2021-10-09 05:44:21 字數 1415 閱讀 7652

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

例如,[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計乙個支援以下兩種操作的資料結構:

void addnum(int num) - 從資料流中新增乙個整數到資料結構中。

double findmedian() - 返回目前所有元素的中位數。

示例 1:

輸入:["medianfinder","addnum","addnum","findmedian","addnum","findmedian"]

[,[1],[2],,[3],]

輸出:[null,null,null,1.50000,null,2.00000]

示例 2:

輸入:["medianfinder","addnum","findmedian","addnum","findmedian"]

[,[2],,[3],]

輸出:[null,null,2.00000,null,2.50000]

限制:最多會對 addnum、findmedia進行 50000 次呼叫。

將資料分成左右兩部分,左邊是小數,按照大堆排序;右邊是大數,按照小堆排序
priority_queue,less> 大堆(預設)

priority_queue.greater> 小堆

複雜度

o時間複雜度

o()空間複雜度

o()

class

medianfinder

void

addnum

(int num)

}double

findmedian()

private

: priority_queue<

int, vector<

int>

, less<

int>> lo;

// 大頂堆

priority_queue<

int, vector<

int>

, greater<

int>> hi;

// 小頂堆};

/** * your medianfinder object will be instantiated and called as such:

* medianfinder* obj = new medianfinder();

* obj->addnum(num);

* double param_2 = obj->findmedian();

*/

劍指 Offer 41 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例...

劍指Offer41 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 輸入...

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

這道題涉及到對堆這個資料結構的使用,落實到 上實際使用的是優先佇列 優先佇列底層可以通過堆來實現 題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數 值排序之後中間兩個數的平均值。例如...