隨時找到資料流的中位數

2021-10-10 14:12:12 字數 1297 閱讀 3074

有乙個源源不斷的吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。

[要求]

1. 如果medianholder已經儲存了吐出的n個數,那麼將乙個新數加入到medianholder的過程,其時間複雜度是o(logn)。

2. 取得已經吐出的n個數整體的中位數的過程,時間複雜度為o(1)

每行有乙個整數opt表示操作型別

若opt=1,則接下來有乙個整數n表示將n加入到結構中。

若opt=2,則表示詢問當前所有數的中位數

示例1

[[1,5],[2],[1,3],[2],[1,6],[2],[1,7],[2]]
[5,4,5,5.5]
第一次查詢時結構內的數為:5

第二次查詢時結構內的數為:3 5

第二次查詢時結構內的數為:3 5 6

第二次查詢時結構內的數為:3 5 6 7

示例2

[[2],[1,1],[2]]
[-1,1]
【解析】

設計medianholder中兩個堆,乙個大根堆,乙個小根堆。其中大根堆中接收所有數中較小的一半,這個堆中的堆頂就是較小那部分數中的最大值。小根堆則接收所有數中較大的一半,對頂則是較大一半數中的最小值。

具體流程如下:

1)第乙個出現的數直接插入大根堆

2)以後每出現乙個數num,判斷num是否小於或者等於大根堆的堆頂。如果是,num進入大根堆;如果不是,num進入小根堆

3)每乙個數加入完成後,判斷大根堆和小根堆的大小。如果兩個堆得個數相差超過1,從較多的那個堆中彈出堆頂,加入另乙個堆。

class solution else

}else;

class medianfinder 

void addnum(int num) else

}double findmedian()

};/**

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

* medianfinder* obj = new medianfinder();

* obj->addnum(num);

* double param_2 = obj->findmedian();

*/

隨時找到資料流的中位數

題目 有乙個源源不斷地吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 1 如果medianholder已經儲存了吐出的n個數,那麼任意時刻將乙個新數加入到medianholder的過程...

隨時找到資料流的中位數

題目描述 有乙個源源不斷地吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 方法方法1 我們收集到資料之後排序,這樣的時間複雜度就是排序的時間複雜度最好也是o nlogn 無法滿足要求 ...

隨時找到資料流的中位數

隨時找到資料流的中位數 有乙個源源不斷的吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 如果medianholder已經儲存了吐出的n個數,那麼將乙個新數加入到medianholder...