劍指offer 資料流中的中位數

2022-03-13 05:07:21 字數 934 閱讀 7627

題目描述

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

分析:大根堆小根堆法

現在假設陣列有序,如果我們把陣列的前半部分放入乙個大根堆,陣列的後半部分放入乙個小根堆,那麼中位數就只能是大根堆的堆頂元素和小根堆的堆頂元素,或者二者堆頂元素的平均值

我們在插入的時候只有遵循某種規則,就能達到這種效果

插入的時候兩個堆的元素數量不同,則將新元素插入數量少的堆

若元素數量相同,則隨便插入乙個堆

若大根堆的堆頂元素大於小根堆的堆頂元素,則交換其堆頂元素

插入完成後,根據元素的數量來確定中位數的值

時間複雜度:插入乙個數o(n*log n),獲取中位數o(1)

class

solution

else

if(q2.size()>q1.size())

else

if(q1.size()>q2.size())

//根據大根堆小根堆堆頂元素的關係判斷是否交換堆頂元素,

//保證堆中的資料是正確的

//(即大根堆儲存有序陣列前半部分的元素,小根堆儲存有序陣列後半部分的元素)

if(q1.size()!=0&&q2.size()!=0

) }}

double

getmedian()

else

if(q2.size()>q1.size())

else

if(q1.size()>q2.size())

return

x; }

};

劍指offer 資料流中的中位數

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

劍指Offer 資料流中的中位數

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

劍指offer 資料流中的中位數

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