法一:用Multiset做的,因为它有个自动排序功能
class Solution {
public:
void Insert(int num)
{
stream.insert(num);
}
double GetMedian()
{
double res = 0.0;
unsigned int size = stream.size();
multiset<int>::iterator it = stream.begin();
unsigned int cnt = size / 2;
while(cnt){
--cnt;
++it;
}
if(size % 2 == 0)
res = (double)(*it + *(--it)) / 2;
else
res = *it;
return res;
}
private:
multiset<int> stream;
};法二:用最大堆最小堆做
class Solution {
private:
int size = 0;
priority_queue<int, vector<int>, less<int>> max;
priority_queue<int, vector<int>, greater<int>> min;
public: //用一个最大堆和一个最小堆做
void Insert(int num)
{
++size;
//偶数时,放入最小堆,奇数时,放入最大堆
//如果num为偶数,且比最小堆的top还大,则先入最小堆,再把堆顶入最大堆;num奇数同理
if(size & 1){
if(!min.empty() && num > min.top()){
min.push(num);
num = min.top();
min.pop();
}
max.push(num);
}
else{
if(!max.empty() && num < max.top()){
max.push(num);
num = max.top();
max.pop();
}
min.push(num);
}
}
double GetMedian()
{
double res = 0.0;
if(size == 0) return res;
if(size & 1){
res = max.top();
}
else{
res = (max.top() + min.top()) / 2.0;
}
return res;
}
};
京公网安备 11010502036488号