如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
例如,[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計乙個支援以下兩種操作的資料結構:
示例 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]
限制:
class
medianfinder
void
addnum
(int num)
else
return;}
double
findmedian()
private
: vector<
int> largerootheap;
vector<
int> smallrootheap;
void
insertheap
(vector<
int>
& heap,
int value,
int type)
return;}
intpopheaptop
(vector<
int>
& heap,
int type)
return top;}}
;/**
* your medianfinder object will be instantiated and called as such:
* medianfinder* obj = new medianfinder();
* obj->addnum(num);
* double param_2 = obj->findmedian();
*/
使用乙個大根堆largerootheap
儲存陣列的較小一半,使用乙個小根堆smallrootheap
儲存陣列的較大一半;
判斷大根堆與小根堆的元素個數,若大根堆元素個數較少或兩堆元素個數相等,則希望大根堆的元素+1,否則希望小根堆的元素+1;
大根堆的元素+1:向小根堆插入新元素,並取出小根堆堆頂元素插入大根堆;
小根堆的元素+1:向大根堆插入新元素,並取出大根堆堆頂元素插入小根堆;
取出中位數:若兩堆元素相等,取兩堆頂元素平均值,否則取大根堆堆頂。
《劍指offer》 41 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 vo...
劍指Offer41 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 輸入...
劍指offer 41 資料流中的中位數
這道題涉及到對堆這個資料結構的使用,落實到 上實際使用的是優先佇列 優先佇列底層可以通過堆來實現 題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數 值排序之後中間兩個數的平均值。例如...