如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
先排序後求解這樣能過:
# -*- coding:utf-8 -*-
class
solution
:def
__init__
(self)
: self.data =
definsert
(self, num)
:# write code here
self.data.sort(
)def
getmedian
(self, data)
:# write code here
length =
len(self.data)
return self.data[length//2]
if length%2==
1else\
(self.data[
(length//2)
-1]+self.data[
(length//2)
])/2.0
可以建立乙個大頂堆加乙個小頂堆,分別存放較小和較大資料:
當兩個堆資料個數為偶數的時候,把數存入最大堆,然後重排最大堆,如果最大堆的堆頂數字大於最小堆堆頂數字,則把兩個堆頂數字交換,重排兩堆,此時兩堆數字總數為奇數,直接輸出最大堆堆頂數字即為中位數;
當兩堆資料總數為奇數的時候,把數存入最小堆,重排最小堆,如果最大堆的堆頂數字大於最小堆堆頂數字,則把兩個堆頂數字交換,重排兩堆,此時兩堆數字總數為偶數,取兩堆堆頂數字做平均即為中位數。
在這裡大小堆不必分別構造,構造乙個另外乙個變換符號即可用:
# -*- coding:utf-8 -*-
class
solution
:def
__init__
(self)
: self.small =
# 小的數,大頂堆
self.big =
# 大的數,小頂堆
self.count =
0# 計數
definsert
(self, num)
:# write code here
if self.count%2==
0:else
:-num)
self.count +=
1def
getmedian
(self, a)
:# write code here
if self.count ==1:
return self.small[0]
self.maxheap(self.small)
self.maxheap(self.big)
# 用大頂堆構建小頂堆,變符號就行
if self.small[0]
>
-self.big[0]
: self.small[0]
, self.big[0]
=-self.big[0]
,-self.small[0]
self.maxheap(self.small)
self.maxheap(self.big)
if self.count%2==
1:return self.small[0]
else
:return
(self.small[0]
-self.big[0]
)/2.0def
maxheap
(self, data)
:# 構建最大堆
for start in
range
(len
(data)//2
-1,-
1,-1
):root = start
while
true
: child =
2*root +
1if child >=
len(data)
:# 無子節點
break
if child+
1<
len(data)
and data[child+1]
> data[child]
: child +=
1# 找較大子節點
if data[root]
< data[child]
: data[root]
, data[child]
= data[child]
, data[root]
root = child
else
:break
return data
劍指offer 63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。為了保證插入新資料和取...
劍指offer63 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。首先要理解題目,對於乙...
劍指offer 63 樹 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。理解了上面所述的主體思...