題目描述
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
方法一:
陣列插入進去然後再排序,這種情況插入時間效率是o(n),找中位數時間效率是o(1)。
class
solution}}
double
getmedian()
};
方法二:
大頂堆和小頂堆。插入的時間效率是o(logn),找中位數的時間效率是o(1)。
使用c++ stl優先佇列priority_queue:
priority_queue ,greater> minheap;//構造小頂堆
priority_queue ,less> maxheap;//構造大頂堆
思路:以中位數為分界點將整個輸入資料分成兩部分;
根據中位數的性質,當輸入元素為奇數時,中位數字於儲存前半部分資料的大頂堆中;當輸入元素為偶數時,中位數字於儲存後半部分資料的小頂堆中。在大頂堆中加入元素的後,將大頂堆中的最大的元素(maxheap.top())加入到小頂堆中,在小頂堆中加入元素的後,將小頂堆中的最小的元素(minheap.top())加入到大頂堆中。
class
solution
else
}double
getmedian()
};
方法三:
利用標頭檔案algorithm中的make_heap()、push_heap()、pop_heap()
注意在使用以上三個函式是要註明less< int>()(表示降序序列,構造大頂堆),greater< int>()(表示公升序序列,構造小頂堆);預設狀態是構造大頂堆。
注意:pop_heap()的作用是:交換* first和 * (last-1), 然後把[first, last-1)建成乙個max heap(預設狀態下). 也就是說把堆頂的最大元素交換到區間尾,然後把除了尾部的元素的剩餘區間重新調整成堆。注意此時並不是真正的刪除,只是將原堆頂的最大元素交換到區間尾。在本題中需要呼叫pop_back才能將原堆頂元素徹底刪除。
class
solution
else
}double
getmedian()
};
劍指offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。實現 public class getmediannum listnode in new listnod...
劍指Offer 資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。思路整理 這個題目要解出來很簡單,但是這裡有乙個比較好的思路 用最大和最小堆來實現,就像乙個沙漏一樣,上...
劍指offer 資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。資料流中的資料需要用合...