class MedianFinder {
public:
multiset<int> num;
multiset<int>::iterator left,right;
/** initialize your data structure here. */
MedianFinder():left(nums.end(),right(num.end())) {}
void addNum(int num) {
const size_t n = nums.size();
nums.insert(num);
//集合为空时
if(n == 0){
left = right = nums.begin();
}else if(n%2 == 1){
//不为空且个数为奇数(原来) 奇数时left和right同指一处
//比较该数和中位数
if(num<*left){
left--;
}else{
right++;
}
}else{
//不为空且原来个数为偶数 需要比较该数和left right分别所指的数
if(num>*left && num<*right){
//调整left和right
left++;
right--;
}else if(num>=*right){
//比右数大 调整left
left++;
}else{
//比左数小 调整right
right--;
left = right;
}
}
}
double findMedian() {
return (*left+*right)/2.0;
}
};
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/
力扣算法篇:数据流的中位数
最新推荐文章于 2022-07-24 14:00:27 发布