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

2022-05-08 22:15:06 字數 876 閱讀 4165

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

這題沒做過,用乙個最大堆和乙個最小堆來夾逼中位數,記錄一下這個方法。

限制條件有兩個:

1.最大堆的數都比最小堆小,這一點可以通過二者的top來限制(即限制最大堆的top小於最小堆的top)。

2.最小堆的size要麼等於最大堆的size,要麼比最大堆的size大1。這是什麼意思呢,舉個栗子:

最大堆:1,2,3,4

最小堆:6,7,8,9(當然這裡不符合堆的性質,只是舉例其中含有的數字)

那麼此時二者size相同,中位數就是最小堆的top。

如果最小堆多乙個10,即此時最小堆為:6,7,8,9,10

那麼中位數就恰好是最大堆的top和最小堆的top的平均數。

另外一點就是priority_queue預設是最大堆,greater是最小堆,less是最大堆,下次記住吧。。。。

1

class

solution

10else

13while(not heap_le.empty() and not heap_ri.empty() and heap_le.top()>heap_ri.top())

17while(heap_le.size()>heap_ri.size())

21while(heap_le.size()1)25

}2627double

getmedian()

2831 };

2020-02-14 15:14:57

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

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

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

題目 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如 2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構...

劍指offer 資料流中的中位數

題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。實現 public class getmediannum listnode in new listnod...