有乙個源源不斷的吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫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...