Leetcode 資料流的中位數

2021-10-03 21:29:19 字數 1075 閱讀 9117

leetcode

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

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

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

由於陣列是動態的,不斷會有新的資料加入,如果每次都進行重新排序會很麻煩,考慮能維持有序的結構,平衡的二叉搜尋樹:左節點的值《根節點《右節點, 根節點為中位數

平衡二叉搜尋樹的實現較為複雜,可以考慮轉換成更容易的頂堆

平衡二叉搜尋樹的左子樹均小於根節點,右子樹均大於根節點,可以考慮將左子樹構造乙個大頂堆,右子樹構造小頂堆,同時滿足大頂堆的最大值小於小頂堆的最小值

最大堆儲存n+1/n個元素,最小堆儲存n個元素

每當有新的資料流入,先將其新增到最大堆,然後取出最大堆的堆頂元素,新增到最小堆,如果現在所有元素個數為奇數個,為保持最大堆個數大於最小堆,取出最小堆的堆頂元素加入最大堆,反之不做任何操作

import heapq

class

medianfinder

:def

__init__

(self)

:"""

initialize your data structure here.

"""self.count =

0 self.minh =

self.maxh =

defaddnum

(self, num:

int)

->

none

: self.count +=

1-num)

-max_top)

if self.count &1:

-min_top)

deffindmedian

(self)

->

float

:if self.count&1:

return

-self.maxh[0]

else

:return

(self.minh[0]

-self.maxh[0]

)/2

leetcode 資料流的中位數

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例 addnum 1 addnum 2 findmedian 1.5 addnum 3 findmedian 2...

每日leetcode 資料流的中位數

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

資料流的中位數

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