class Solution {
public:
void Insert(int num)
{
int n = min.size(); //最小堆的元素
int m = max.size(); //最大堆的元素
if (((n + m) &1) == 0) //若为偶数,即n == m //则将元素插入最大堆
{
if (n > 0 && num > min[0]) //原本是要插入到最大堆的,可是这个数比最小堆堆堆顶大,则需要调换
{
int temp = min[0]; //最小堆堆顶元素
pop_heap(min.begin(), min.end()); // pop最小堆最顶元素
min.pop_back();
min.push_back(num); //push num到最小堆
make_heap(min.begin(), min.end(), greater<int>());
max.push_back(temp);
make_heap(max.begin(), max.end());
}
else {
max.push_back(num);
make_heap(max.begin(), max.end());
}
}
else { //若为奇数,插入元素到最小堆。此时一定有 m > 0
if (num < max[0]) //若有num小于最大堆堆顶,则需要把最大堆堆顶 放入最小堆
{
int temp = max[0];
pop_heap(max.begin(), max.end()); //将最大堆堆顶换至到末尾
max.pop_back();
max.push_back(num);
make_heap(max.begin(), max.end());
min.push_back(temp);
make_heap(min.begin(), min.end(), greater<int>());
}
else { //直接插入最小堆堆顶
min.push_back(num);
make_heap(min.begin(), min.end(), greater<int>());
}
}}
double GetMedian()
{
double res;
int m = max.size(); //最大堆堆顶元素
int n = min.size();
if (m == n && m == 0)
return 0.0;
if (n == m)
res = (double)((max[0] + min[0]) / 2.0);
if (n != m)
res = (double)max[0];
return res;
}private:
vector<int> min;
vector<int> max;
};</int></int>

京公网安备 11010502036488号