【程序员面试金典】面试题 17.20. 连续中值

news/2024/11/13 3:33:55/

【程序员面试金典】面试题 17.20. 连续中值

    • 题目描述
    • 解题思路

题目描述

描述:随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

解题思路

思路:最直观的想法是,一个大根堆一个小根堆。中值指的是一个有序数组的最中间的一个数或者中间两个数的平均值,那么可以选择排序,但是排序所需要的时间复杂度太高了,所以就考虑什么方法能取到最中间的两个数呢?想象把数组分为两半部分,左半部分我们需要取到最右边的数,即可以使用一个大根堆存储,右半部分我们需要取到最左边的数,即可以使用一个小根堆存储。考虑到数组长度可能为奇数可能为偶数,所以我们默认设计当数组长度为奇数时小根堆比大根堆多存储一个数。

//默认是大根堆 大根堆是less<int>
priority_queue<int> maxpq;
//注意 小根堆是greater<int>
priority_queue<int,vector<int>,greater<int>> minpq;
MedianFinder() {
}
//假设小根堆可以比大根堆多一个
void addNum(int num) 
{if(minpq.empty()||num>=minpq.top()){if(maxpq.size()<minpq.size()){maxpq.push(minpq.top());minpq.pop();}//当两者相等时直接插入小根堆minpq.push(num);}//num<minpq.top()但是可能num>maxpq.top()else{//所以需要先插入再比较maxpq.push(num);if(maxpq.size()>minpq.size())  {minpq.push(maxpq.top());maxpq.pop();               }     }
} 
double findMedian() 
{return maxpq.size()==minpq.size()?(maxpq.top()+minpq.top())/2.0 :minpq.top();
}

总结:注意此处,是先插入再比较,还是先比较再插入。注意语法,less<int>是大根堆,而greater<int>是小根堆。


http://www.ppmy.cn/news/663301.html

相关文章

【深度学习001】深度学习工作站组装—硬件篇—预算2万(20190401)

目录 1. 显卡的选择2. CPU的选择3. 主板的选择4.内存4.电源&#xff0c;机箱&#xff0c;散热5.总花费为&#xff1a;2万左右 一直想搭建一个自己的机器学习工作电脑&#xff0c;不过由于资金不够&#xff0c;一直没能如愿&#xff0c;前几日&#xff0c;咬咬牙自己攒了一台。花…

深度学习装机记录

文章目录 一、主机配件二、组装步骤1.在主板上安装CPU2.在主板上安装内存条3.在主板上安装固态硬盘4.在主板上安装CPU的散热风扇5.将主板放入机箱&#xff0c;上好螺丝6.安装显卡7.在机箱中安装机械硬盘和电源8.在机箱中安装机械硬盘和电源9.布线(参照主板说明书和机箱说明书)1…

基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

【uniapp开发小程序】点击获取手机号(使用@getphonenumber)

一、实现效果 二、代码实现&#xff1a; <template><view><view class"shopadd" v-if"info.mobile">{{info.mobile}}</view><button class"getNumber" v-else open-type"getPhoneNumber" getphonenumber…

js 纯前端实现 重新部署 通知用户刷新网页

需求&#xff1a;有时候上完线&#xff0c;用户还停留在老的页面&#xff0c;用户不知道网页重新部署了&#xff0c;跳转页面的时候有时候js连接hash变了导致报错跳不过去&#xff0c;并且用户体验不到新功能&#xff0c;需要进行优化&#xff0c;每当打包发版后客户进入系统就…

Java工程使用ffmpeg进行音视频格式转换(ws.schild)

ws.schild简介 JAVE (Java Audio Video Encoder)是一个纯Java的音视频编码器和解码器库&#xff0c;它是基于FFmpeg。JAVE库提供了一些简单易用的API&#xff0c;用于音频和视频格式的转换、编码、解码等操作。它对于一些基本的音视频处理任务来说是一个不错的选择。 这些库都…

微信小程序怎么设置打开后最先显示的页面

其实app.json 里"pages"的第一个元素就是最先打开的页面 如下图&#xff1a; “pages/index/index” 就是第一个元素&#xff0c;index就是打开的第一个页面 ~~

企业微信设置可信域名问题

在设置"网页授权及JS-SDK"可信域名时,一直不成功,现在显示:"检查域名所有权不通过".有能解决的伙伴吗? 一个是:“WW_verify_p3pf5b8Bcud74dpo.txt” 上传至填写域名根目录下.这步具体怎么操作. 我的位置是在项目的WebContent下,跟jsp文件一起.目前还没有…