劍指 面試題41 資料流中的中位數

2021-10-23 03:55:45 字數 1959 閱讀 9150

題目

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

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

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

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

(1)void addnum(int num) - 從資料流中新增乙個整數到資料結構中。

(2)double findmedian() - 返回目前所有元素的中位數。

思路1 二分查詢插入

每次將值插在合適的位置,就不用對陣列排序,用二分查詢來找到這個合適的位置(查詢o(l

ogn)

o(logn)

o(logn

),插入o(n

)o(n)

o(n))。

思路2 優先佇列(堆)

leetcode題解參考

時間複雜度o(l

ogn)

o(logn)

o(logn

)

總結:

兩個二分查詢的實現:

c++ 思路一

class

medianfinder

void

addnum

(int num)

double

findmedian()

};/** * your medianfinder object will be instantiated and called as such:

* medianfinder* obj = new medianfinder();

* obj->addnum(num);

* double param_2 = obj->findmedian();

*/

python 思路一

class

medianfinder

:def

__init__

(self)

:"""

initialize your data structure here.

"""self.store =

defaddnum

(self, num:

int)

->

none:if

not self.store:

else

: bisect.insort_left(self.store, num)

# 使用二分查詢插入,bisect.insort_left會返回插入的位置,這裡不需要這個位置,只執行插入操作

deffindmedian

(self)

->

float

: n =

len(self.store)

if n &1==

1:# n是奇數

return self.store[n //2]

else

:return

(self.store[n //2]

+ self.store[n //2-

1])/

2# your medianfinder object will be instantiated and called as such:

# obj = medianfinder()

# obj.addnum(num)

# param_2 = obj.findmedian()

面試題41 劍指offer 資料流中的中位數

題目 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路 建立兩個堆,乙個最小堆乙個最大堆,要達到當元素數量是偶數時,中位數就是兩個堆頂的平均值,如果為奇數,就...

面試題41 資料流中的中位數

題目 解答 方法一 c 超時 1 class medianfinder 1011 returns the median of current data stream 12double findmedian 1319 方法二 二分查詢插入 方法一的缺點在於對陣列進行了排序操作,導致時間複雜度較高,假如...

劍指offer 面試題 資料流中的中位數

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