題目描述:如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
例如,[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計乙個支援以下兩種操作的資料結構:
void addnum(int num)- 從資料流中新增乙個整數到資料結構中。
double findmedian()- 返回目前所有元素的中位數。
示例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]
解題思路:利用大、小頂堆:
建立乙個 小頂堆a
和 大頂堆b
各儲存陣列的一半元素,且小頂堆a
儲存較大的那一半元素,大頂堆b
儲存較小的那一半元素,當陣列元素個數為奇數時,使用小頂堆來儲存多出來的那乙個元素,即a.size()= b.size() + 1
;否則a.size() = b.size()
。
當陣列的元素為奇數時,中位數為小頂堆a
的棧頂元素a.peek()
;當陣列的元素為偶數時,中位數為小頂堆a
和大頂堆b
的棧頂元素之和的一半,即(a.peek() + b.peek()) / 2
。
為了保證大小頂堆中元素的個數和性質,在新增元素時需要根據大小頂堆的大小來新增元素,同時在新增的過程中保證a中的元素比b中元素大,具體做法參見**。
時間複雜度:這種解法的插入元素的時間複雜度為o(logn),得到中位數的時間複雜度為o(1)。
實現**:
class
medianfinder
public
void
addnum
(int num)
else
}public
double
findmedian()
}
劍指 Offer 41 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例...
《劍指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 設計乙個支援以下兩種操作的資料結構 輸入...