中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。
例如,
[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計一個支持以下兩種操作的數據結構:
- void addNum(int num) - 從數據流中添加一個整數到數據結構中。
- double findMedian() - 返回目前所有元素的中位數。
示例:
addNum(1) addNum(2) findMedian() -> 1.5 addNum(3) findMedian() -> 2進階:
- 如果數據流中所有整數都在 0 到 100 範圍內,你將如何優化你的算法?
- 如果數據流中 99% 的整數都在 0 到 100 範圍內,你將如何優化你的算法?
用優先隊列模擬一個大堆和小堆。如果小堆的數量大於大堆,則最大數是小堆的堆頂。若相等,則中位數是(大堆的堆頂+小堆的堆頂)/2.
因爲堆的從大到小存放,所以大堆我們存放負數,就變成了(整數)從小到大的排放的。class MedianFinder { public: /** initialize your data structure here. */ MedianFinder() { } void addNum(int num) { small.push(num); large.push(-small.top()); small.pop(); if(small.size()<large.size()) { small.push(-large.top()); large.pop(); } } double findMedian() { if(small.size()>large.size()) return small.top(); else return (small.top()-large.top())/2.0; } private: priority_queue<int>small,large; }; /** * Your MedianFinder object will be instantiated and called as such: * MedianFinder obj = new MedianFinder(); * obj.addNum(num); * double param_2 = obj.findMedian(); */
Leetcode 295. 數據流的中位數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.