题解 | #数据流中的中位数#

数据流中的中位数

https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1

数据流中的中位数:最直观的想法是,使用sort函数对数组进行排序,如果数组长度为奇数,则返回数组最中间的一个数,反之如果数组长度为偶数,则返回数组最中间的两个数之和的平均值。

vector<int> res; //结果数组
 
void Insert(int num) 
{
    //存储数据
    res.push_back(num);
}
 
double GetMedian() 
{
    //排序
    sort(res.begin(),res.end());
    //求长度
    int n=res.size();
    //中位数结果
    double result;
    //数组长度为奇数
    if(n%2!=0)
       result=res[n/2];
    //数组长度为偶数
    else
       result=(res[n/2]+res[n/2-1])/2.0;
    return result;
}

优化:排序是从小到大的数组,例如[0,1,2…medium-1,medium,medium+1…n-2,n-1,n],将其分为前半部分[0,1,2…medium-1]和后半部分[medium+1…n-2,n-1,n],此时我们可以使用对顶堆来进行存储,即使用大顶堆存储前半部分,使用小顶堆存储后半部分,既然元素是从小到大,那么我们需要满足大顶堆的所有元素都要比小顶堆的所有元素小,且大顶堆与小顶堆相差的元素个数不能超过1,我们假设如果两个堆的元素个数不相等的话小顶堆的元素个数比大顶堆的元素个数多一,即假如元素为1,2,3,4,5,那么大根堆存储1,2,小根堆存储3,4,5。那么如何实现大顶堆的所有元素都要比小顶堆的所有元素小呢?我们在插入元素时,如果两个堆的元素个数不相等,则先将元素插入到小根堆,然后再弹出元素到大根堆,即使得小根堆元素个数与大根堆元素个数相等,反之如果两个堆的元素个数相等,则先将元素插入到大根堆,然后再弹出元素到小根堆,即使得小根堆元素个数比大根堆元素个数多一,同时也保持了两个堆的元素大小关系。最后,如果两个堆的元素个数不相等,则肯定是小根堆的元素个数比大根堆的元素个数多一,直接返回小根堆的堆顶即可,反之返回小根堆的堆顶和大根堆的堆顶的平均值。

priority_queue<int> max_que; //大根堆
priority_queue<int,vector<int>,greater<int>> min_que; //小根堆

void Insert(int num) 
{
     //两个堆的元素个数不相等
     if(max_que.size()!=min_que.size())
     {
         min_que.push(num);
         max_que.push(min_que.top());
         min_que.pop();
     }
     //两个堆的元素个数相等
     else 
     {
         max_que.push(num);
         min_que.push(max_que.top());
         max_que.pop();
     }
}

double GetMedian() 
{ 
     double result; //结果
     //两个堆元素相等
     if(min_que.size()==max_que.size())
        result=(min_que.top()+max_que.top())/2.0;
     else
        result=min_que.top();
     return result;
}

剑指offer 文章被收录于专栏

剑指offer专栏主要分享剑指offer题解。

全部评论

相关推荐

07-25 11:26
清华大学 Java
打开电脑,思绪又回到了7月份刚开始的时候,感觉这个月过的如梦如幻,发生了太多事,也算是丰富了我本就是平淡的人生吧太早独立的我习惯了一切都是自己做决定,拥有绝对的决定权,而且永远不会听取别人的建议。我就是那个恋爱四年出轨的男主啦,感觉既然在牛客开了这个头,那我就要做个有始有终的人。从我出轨到结束再到和女朋友和好如初真的太像一场梦了,短短的一个月我经历了太多,也成长了很多,放下了那些本就不属于我的,找回了那些我不该放弃的。我的人生丰富且多彩,但人不能一直顺,上天总会让你的生活中出点乱子,有好有坏,让你学会一些东西,让你有成长。我和女朋友的恋爱四年太过于平淡,日常除了会制造一些小浪漫之外,我们的生活...
段哥亡命职场:不得不说,我是理解你的,你能发出来足见你是个坦诚的人,至少敢于直面自己的内心和过往的过错。 这个世界没有想象中那样非黑即白,无论是农村还是城市,在看不见的阴影里,多的是这样的事。 更多的人选择站在制高点去谩骂,一方面是社会的道德是需要制高点的,另一方面,很多人不经他人苦,却劝他人善。 大部分的我们,连自己生命的意义尚且不能明晰,道德、法律、困境,众多因果交织,人会迷失在其中,只有真的走出来之后才能看明白,可是没走出来的时候呢?谁又能保证自己能走的好,走的对呢? 可是这种问题有些人是遇不到的,不去追寻,不去探寻,也就没了这些烦恼,我总说人生的意义在过程里,没了目标也就没了过程。 限于篇幅,没法完全言明,总之,这世界是个巨大的草台班子,没什么过不去了,勇敢面对,革故鼎新才是正确,祝你早日走出来。查看图片
点赞 评论 收藏
分享
06-25 09:33
厦门大学 Java
球球别拷打俺了:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务