剑指 Offer 41. 数据流中的中位数 - 力扣(LeetCode)
一样的题:LeetCode第 295 题:数据流中的中位数(C++)_zj-CSDN博客
class MedianFinder {
public:
/** initialize your data structure here. */
MedianFinder() {
}
void adjust(){//调整数量以达到要求
auto x = cnt%2;
if(q1.size() > cnt/2+x){
q2.push(q1.top());
q1.pop();
}
else if(q1.size() < cnt/2+x){
q1.push(q2.top());
q2.pop();
}
}
void addNum(int num) {
if(q1.empty() || num <= q1.top()) q1.push(num);
else q2.push(num);
++cnt;
adjust();
}
double findMedian() {
return cnt%2 ? q1.top() : (q1.top()+q2.top())/2.0;//注意浮点数处理
}
private:
int cnt = 0;
priority_queue<int, vector<int>, less<int>> q1;//大顶堆(cnt/2或者cnt/2+1个数据)
priority_queue<int, vector<int>, greater<int>> q2;//小顶堆(cnt/2个数据)
};
插入排序:
class MedianFinder {
public:
/** initialize your data structure here. */
MedianFinder() {
}
void addNum(int num) {
auto it = lower_bound(a.begin(), a.end(), num);
a.insert(it, num);
}
double findMedian() {
return a.size()%2 ? a[a.size()/2] : (a[a.size()/2] + a[a.size()/2-1])/2.0;
}
private:
vector<int> a;
};