隨時找到資料流的中位數
有乙個源源不斷的吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。
[要求]
如果medianholder已經儲存了吐出的n個數,那麼將乙個新數加入到medianholder的過程,其時間複雜度是o(l
ogn)
o(logn)
o(logn
)。取得已經吐出的n個數整體的中位數的過程,時間複雜度為o(1
)o(1)
o(1)
輸入描述:
第一行乙個整數q,表示有q次詢問。
接下來q行,每行有乙個整數opt表示操作型別
若opt=1,則接下來有乙個整數n表示將n加入到結構中。
若opt=2,則表示詢問當前所有數的中位數
輸出描述:
輸出若干行,每行乙個浮點數數表示該次詢問的答案(保留至小數點後一位)
若詢問時資料流中沒有數輸出-1(不需要輸出小數點後的數字)
具體輸出要求請看樣例
示例1輸入
8
1 52
1 32
1 62
1 72
輸出5.0
4.05.0
5.5
說明第一次查詢時結構內的數為:5
第二次查詢時結構內的數為:3 5
第二次查詢時結構內的數為:3 5 6
第二次查詢時結構內的數為:3 5 6 7
示例2
輸入
3
21 1
2
輸出-1
1.0
備註:
1 ⩽q
⩽105
1 \leqslant q \leqslant 10^5
1⩽q⩽1050⩽
ai⩽1
09
0 \leqslant a_i \leqslant 10^9
0⩽ai⩽
109題解:
對頂堆,乙個大根堆,乙個小根堆。大根堆儲存較小的一半元素
,小根堆儲存較大的一半元素
,任何時候,乙個堆的元素相比較另乙個堆元素個數,最多大於1。這樣,在求中位數時,根據元素個數奇偶性選擇堆頂即可。
**:
#include
#include
using
namespace std;
intmain
(void
)else qmax.
push
( x );if
( qmax.
size()
> qmin.
size()
+1)else
if( qmin.
size()
> qmax.
size()
+1)}
else
else}}
return0;
}
隨時找到資料流的中位數
題目 有乙個源源不斷地吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 1 如果medianholder已經儲存了吐出的n個數,那麼任意時刻將乙個新數加入到medianholder的過程...
隨時找到資料流的中位數
題目描述 有乙個源源不斷地吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 方法方法1 我們收集到資料之後排序,這樣的時間複雜度就是排序的時間複雜度最好也是o nlogn 無法滿足要求 ...
隨時找到資料流的中位數
有乙個源源不斷的吐出整數的資料流,假設你有足夠的空間來儲存吐出的數。請設計乙個名叫medianholder的結構,medianholder可以隨時取得之前吐出所有數的中位數。要求 1.如果medianholder已經儲存了吐出的n個數,那麼將乙個新數加入到medianholder的過程,其時間複雜度...