设计一个数据结构,该数据结构动态维护一组数据,且支持如下操作:
- 添加元素:void addNum(int num),将整型num添加至数据结构中。
- 返回数据的中位数:double findMedian(),返回其维护的数据的中位数。
中位数定义: - 若数据个数为奇数,中位数是该数组排序后中间的数。
- 若数据个数为偶数,中位数是该数据排序后中间的两个数字的平均值。
最直观的方法:
存储结构使用数组,每次添加元素或查找中位数时对数组排序,再计算结果。
时间复杂度:
- 若添加元素时排序,addNum复杂度O(n), findMedian复杂度O(1)
- 若查询中位数时排序,addNum复杂度O(1), findMedian复杂度O(nlogn)
若添加元素或查询中位数时随机的操作,共n次,按上述思想,整体复杂度最佳为O(n^2)
巧用堆的性质:
动态维护一个最大堆与一个最小堆,最大堆存储一半数据,最小堆存储一半数据,维持最大堆的堆顶比最小堆的堆顶小。
#include<stdio.h>
#include<queue>
class MedianFinder
{
public:
MedianFinder(){
}
~MedianFinder(){
}
std::priority_queue<int, std::vector<int>, std::greater<int>> small_queue; //最小堆
std::priority_queue<int> big_queue; //最大堆
void addNum(int num)
{
if (big_queue.empty())