劍指offer 18 資料流中的中位數

2021-10-02 15:04:59 字數 663 閱讀 5999

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

一般資料流我們用陣列來表示,要得到中位數有很多種方法,這裡介紹一種時間複雜度較小的方法,用c++種的優先順序佇列。

也就是劍指offer書上的方法,把陣列邏輯上分成兩個部分,左邊為最大堆,右邊為最小堆。我們始終要保證最大堆中最大的元素要小於最小堆中最小的元素即可,當然除此之外,還要判斷陣列中元素個數是偶數還是奇數,如果要判斷我們必須要讓兩個堆中的元素個數之差不大於1,在這裡,我們保證最大堆的元素個數可以等於最小堆元素個數+1,但是最小堆堆元素個數最多只能與最大堆相同。 那麼如果兩個堆的元素個數相同,那麼就是偶數,那麼中位數就是兩個堆頂元素之和除以2,如果不相同的話,說明最大堆的元素個數多,取最大堆堆頂元素即可。

class

solution

if(max.

size()

+1== min.

size()

)}double

getmedian()

};

劍指offer 資料流中的中位數

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

劍指Offer 資料流中的中位數

題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路整理 這個題目要解出來很簡單,但是這裡有乙個比較好的思路 用最大和最小堆來實現,就像乙個沙漏一樣,上...

劍指offer 資料流中的中位數

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