如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
理解了上面所述的主體思想,下面舉個例子輔助驗證一下。
例如,傳入的資料為:[5,2,3,4,1,6,7,0,8],那麼按照要求,輸出是"5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00 "
那麼整個程式的執行流程應該是(用min表示小頂堆,max表示大頂堆):
//小頂堆private priorityqueueminheap = new priorityqueue();
//大頂堆
private priorityqueuemaxheap = new priorityqueue(15, new comparator()
});//記錄偶數個還是奇數個
int count = 0;
//每次插入小頂堆的是當前大頂堆中最大的數
//每次插入大頂堆的是當前小頂堆中最小的數
//這樣保證小頂堆中的數永遠大於等於大頂堆中的數
//中位數就可以方便地從兩者的根結點中獲取了
public
void
insert(integer num)
else
count++;
}public
double getmedian()
else
}
劍指offer 63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。為了保證插入新資料和取...
劍指offer63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。先排序後求解這樣能過 ...
劍指offer63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。首先要理解題目,對於乙...