数据流中的中位数
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>