} voidaddNum(int num){ if (bigHeap.empty()) { bigHeap.emplace(num); return; } if (num >= bigHeap.top()) { smallHeap.emplace(num); if (smallHeap.size() > bigHeap.size()) { bigHeap.emplace(smallHeap.top()); smallHeap.pop(); } }else{ bigHeap.emplace(num); if (bigHeap.size() > smallHeap.size()+1){ smallHeap.emplace(bigHeap.top()); bigHeap.pop(); } } } doublefindMedian(){ // 左右堆的大小一样,即数的个数为偶数 if (bigHeap.size() == smallHeap.size()){ return bigHeap.top() + (smallHeap.top()-bigHeap.top())/2.0; }else{ return bigHeap.top(); }
} };
/** * Your MedianFinder object will be instantiated and called as such: * MedianFinder* obj = new MedianFinder(); * obj->addNum(num); * double param_2 = obj->findMedian(); */
classMedianFinder { multiset<int> nums; multiset<int>::iterator left, right; public: MedianFinder() : left(nums.end()), right(nums.end()) {} voidaddNum(int num){ auto n = nums.size(); nums.insert(num); if (n == 0) { left = right = nums.begin(); }elseif (n&1) { //集合元素个数原本为奇数 if (num >= *right){ right++; }else{ left--; } }else{ //原本为偶数,这时再加一个数,则left和right会指向中间同一个数 // 有序集合的特点是,如果数相等,新数会在旧数的右边 if (num >= *right){ left++; }else{ right--; left = right; } } } doublefindMedian(){ 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(); */