题解:有序容器+双指针
class MedianFinder {
multiset<int> rb_s;
multiset<int>::iterator l,r;
public:
/** initialize your data structure here. */
MedianFinder() {
l=rb_s.end();
r=rb_s.end();
}
void addNum(int num) {
int n=rb_s.size();
rb_s.insert(num);
if(n==0){
l=r=rb_s.begin();
}else if(n%2==1){
if(num<*l){
l--;
}else{
r++;
}
}else{
if(num>=*l&&num<*r){
l++;
r--;
}else if(num>=*r){
l++;
}else if(num<*l){
r--;
}
}
}
double findMedian() {
return (*l+*r)/2.0;
}
};
结论:multiset中的insert将相同元素插入到对应元素的后面(稳定排序)
#include<iostream>
#include<string>
#include<vector>
#include<set>
using namespace std;
int main(){
multiset<int> s;
s.insert(5);
s.insert(1);
s.insert(3);
auto it=s.begin();
it++;
cout<<*it<<endl;
s.insert(3);
s.insert(3);
cout<<*it<<endl;
it++;
cout<<*it<<endl;
it++;
cout<<*it<<endl;
it++;
cout<<*it<<endl;
}
3
3
3
3
5