leetcode 資料流的中位數

2021-10-07 12:09:26 字數 880 閱讀 1548

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。

例如,[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計乙個支援以下兩種操作的資料結構:

示例:

addnum(1)

addnum(2)

findmedian() -> 1.5

addnum(3)

findmedian() -> 2

高階:

如果資料流中所有整數都在 0 到 100 範圍內,你將如何優化你的演算法?

如果資料流中 99% 的整數都在 0 到 100 範圍內,你將如何優化你的演算法?

如果把乙個陣列公升序排列之後,我們把這個從中間分成長度差不大於1的兩部分,元素小的記作陣列1,元素大的記作陣列2

如果兩個子陣列等長,那麼中位數就是陣列1的最大值和陣列2的最小值的加和/2。可以理解成中位數左邊和右邊摳出同樣數量的元素。

如果子陣列不等長,那麼中位數就是兩個字陣列中較長的哪乙個元素的最大/最小值。

有了上述的推斷,我們就可以通過兩個堆來實現了,乙個最小堆模擬上述中的陣列1,最大堆模擬上述中的陣列2,需要維護二者長度差值不大於1。

class medianfinder 

public void addnum(int num) else

if(maxqueue.size()==minqueue.size()+2)

if(minqueue.size()==maxqueue.size()+2)

}public double findmedian() elseelse }}

}

Leetcode 資料流的中位數

leetcode 中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 由於陣列是動態的,不斷會有新的資料加入,如果每次都進行重新排序會很麻煩,考慮能維持有序的結構,平衡的二叉搜尋樹 左節點的值 根節點 ...

每日leetcode 資料流的中位數

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 void addnum int num 從資料流中新增乙個整數到資料結構中。double findmedian 返...

資料流的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。coding utf ...