劍指 Offer 41 資料流中的中位數

2021-10-23 22:39:07 字數 1579 閱讀 7574

題目描述:

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。

例如,[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 設計乙個支援以下兩種操作的資料結構 輸入...