1--数据流中的中位数(41)
主要思路:
维护两个优先队列,Q1大数优先,存储比中位数小的数;Q2小数优先,存储比中位数大的数;
当存储的数为偶数时,Q1.size() == Q2.size(), 中位数为:(Q1.top() + Q2.top()) / 2.0
当存储的数为奇数时,Q2.size() = Q1.size() + 1, 中位数为 Q2 的队头元素
因此插入元素,要确保Q2.size() >= Q1.size();
同时插入新元素时,要先插入到另一个队列中,确保有序,取队头元素再插入到目的元素中;
#include <iostream>
#include <queue>
#include <algorithm>
class MedianFinder {
public:
MedianFinder() {}
void addNum(int num) {
// Q1大数优先,存储比中位数小的数
// Q2小数优先,存储比中位数大的数
// 当存储的数为偶数时,Q1.size() == Q2.size(), 中位数为:(Q1.top() + Q2.top()) / 2.0
// 当存储的数为奇数时,Q2.size() = Q1.size() + 1, 中位数为 Q2 的队头元素
// 因此插入元素,要确保Q2.size() >= Q1.size();
// 同时插入新元素时,要先插入到另一个队列中,确保有序,取队头元素再插入到目的元素中
if(Q1.size() == Q2.size()){
Q1.push(num);
int top = Q1.top();
Q1.pop();
Q2.push(top);
}
else{
Q2.push(num);
int top = Q2.top();
Q2.pop();
Q1.push(top);
}
}
double findMedian() {
if(Q1.size() == Q2.size()){
return (Q1.top() + Q2.top()) / 2.0;
}
else{
return Q2.top()*1.0;
}
}
private:
std::priority_queue<int, std::vector<int>, std::less<int>> Q1; // 大数优先级高,队头
std::priority_queue<int, std::vector<int>, std::greater<int>> Q2; // 小数优先级高,队头
};
int main(int argc, char *argv[]){
MedianFinder S1;
S1.addNum(1);
S1.addNum(4);
S1.addNum(2);
S1.addNum(3);
double Res = S1.findMedian();
std::cout << Res << std::endl;
return 0;
}
2--连续子数组的最大和
主要思路: