/* Problem: https://leetcode.com/problems/find-median-from-data-stream/ */ #include #include #include #include #include #include enum class action { addNum, findMedian }; struct instruction { action do_; double val; }; class MedianFinder { private: std::priority_queue, std::greater> min_heap{std::greater{}, {std::numeric_limits::max()}}; std::priority_queue max_heap{std::less{}, {std::numeric_limits::lowest()}}; public: MedianFinder() {} void addNum(double num) { if (min_heap.size() == max_heap.size()) { if (num > min_heap.top()) { min_heap.push(num); } else { max_heap.push(num); } } else if (min_heap.size() < max_heap.size()) { if (num > max_heap.top()) { min_heap.push(num); } else { min_heap.push(max_heap.top()); max_heap.pop(); max_heap.push(num); } } else { if (num > min_heap.top()) { max_heap.push(min_heap.top()); min_heap.pop(); min_heap.push(num); } else { max_heap.push(num); } } } double findMedian() { if (min_heap.size() == max_heap.size()) { return (min_heap.top() + max_heap.top()) / 2; } else if (min_heap.size() < max_heap.size()) { return max_heap.top(); } else { return min_heap.top(); } } }; int main() { std::vector instructions = {{action::addNum, 1}, {action::addNum, 2}, {action::findMedian, 0}, {action::addNum, 3}, {action::findMedian, 0}}; MedianFinder *median_finder = new MedianFinder(); std::cout << "{"; for (instruction &i : instructions) { if (i.do_ == action::addNum) { median_finder->addNum(i.val); std::cout << "null, "; } else if (i.do_ == action::findMedian) { i.val = median_finder->findMedian(); std::cout << i.val << ", "; } } std::cout << "\b\b}\n"; }