如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
importj**a.util.priorityqueue;
import
j**a.util.comparator;
public
class
solution
});public
void
insert(integer num)
else
count++;
}public
double getmedian()
else
}}
左邊:最大堆
右邊:最小堆
當資料總數為偶數時,新加入的元素,應當進入小根堆
(注意不是直接進入小根堆,而是經大根堆篩選後取大根堆中最大元素進入小根堆)
1.新加入的元素先入到大根堆,由大根堆篩選出堆中最大的元素
2.篩選後的"大根堆中的最大元素"進入小根堆
當資料總數為奇數時,新加入的元素,應當進入大根堆
(注意不是直接進入大根堆,而是經小根堆篩選後取小根堆中最大元素進入大根堆)
1.新加入的元素先入到小根堆,由小根堆篩選出堆中最小的元素
2.篩選後的"小根堆中的最小元素"進入大根堆
最大堆還可以用lamda表示式定義:
priorityqueuemaxheap=new priorityqueue<>((o1, o2) -> o2 - o1);
63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路 構造乙個最大堆和乙個最小堆,最大堆用來存放較小的那一半的資料,最小堆用來存放較大的那一半的資料,每次插入資料...
63資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。這個使用優先佇列的思路...
63 劍指offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值 解題思路 分為兩種情況,奇數取中間的數字,偶數取中間兩個數的平均值。使用兩個堆來實現,左側使用最大堆儲存...