題目描述
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。分析:大根堆小根堆法
現在假設陣列有序,如果我們把陣列的前半部分放入乙個大根堆,陣列的後半部分放入乙個小根堆,那麼中位數就只能是大根堆的堆頂元素和小根堆的堆頂元素,或者二者堆頂元素的平均值
我們在插入的時候只有遵循某種規則,就能達到這種效果
插入的時候兩個堆的元素數量不同,則將新元素插入數量少的堆
若元素數量相同,則隨便插入乙個堆
若大根堆的堆頂元素大於小根堆的堆頂元素,則交換其堆頂元素
插入完成後,根據元素的數量來確定中位數的值
時間複雜度:插入乙個數o(n*log n),獲取中位數o(1)
classsolution
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 方法獲取當前讀取資料的中位數。資料流中的資料需要用合...