题目描述
十分简单
思路
用数组或者向量做直接插排必然导致悲剧
想想移位都蛋疼
//我擦数组移位居然能过,真是醉
所以使用堆这种自带大小关系插入快的结构
使用大小顶堆插入管理数集的左右两块即可
这样的话每次插入基本是O(log(n))
每次中值是O(1)
问题不大
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
class MedianFinder
{
public:
void addNum(int num)
{
maxH.push(num);
if (minH.empty() || (!maxH.empty() && minH.top() < maxH.top()) || maxH.size() > minH.size())
{
minH.push(maxH.top());
maxH.pop();
}
if (minH.size() - 1 > maxH.size())
{
maxH.push(minH.top());
minH.pop();
}
}
double findMedian()
{
if (minH.size() == maxH.size())
{
return double(minH.top() + maxH.top()) / 2.0;
}
else
{
return minH.top();
}
}
private:
priority_queue<int, vector<int>, greater<int>> minH;
priority_queue<int> maxH;
};