leetcode-295 数据流的中位数
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[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
针对该问题,由于数组是动态增加的,我们使用传统的查找中位数的方式为:有序数组取中间两位(奇数个数字,取中间一位数字;偶数个数字,取中间两个数字的平均值),那么每次我们增加一个数字就需要重新排序,代价太大
此时我们可以维护两个堆,最大堆存储较小元素,最小堆存储较大元素,且两个堆大小相差不能超过1;此时,我们仅需要每次调整两个堆的堆顶元素即可。
计算中位数时,根据两个堆各自的大小,分别取堆顶进行计算求值。该过程就是会出现重建堆较为耗时(O(nlogn))之外再没有需要消耗时间的地方了
实现如下:
class MedianFinder {public:/** initialize your data structure here. */MedianFinder() { }void addNum(int num) {if (big_heap.empty()) {big_heap.push(num);} else {//当最大堆元素个数大于最小堆元素个数,此时需要向最小堆插入if(big_heap.size() > small_heap.size()) { //但是发现插入的元素 小于 最大堆的元素个数//规则是:最小堆堆顶元素一定大于最大堆的堆顶,所以需要调整最大堆堆顶if (num < big_heap.top()) {small_heap.push(big_heap.top());big_heap.pop();big_heap.push(num);} else {small_heap.push(num);}} else {if (num > small_heap.top()) {big_heap.push(small_heap.top());small_heap.pop();small_heap.push(num);} else {big_heap.push(num);}}}}double findMedian() {if (big_heap.size() > small_heap.size()) {return big_heap.top();} else if (big_heap.size() == small_heap.size()) {return (double)(big_heap.top() + small_heap.top()) / 2.0;} else {return small_heap.top();}}
private:priority_queue<int, vector<int>, greater<int>> small_heap;priority_queue<int, vector<int>, less<int>> big_heap;
};
leetcode-295 数据流的中位数相关推荐
- LeetCode 295. 数据流的中位数 Hard难度
295. 数据流的中位数 题目: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 ...
- Leetcode 295. 数据流的中位数
1.题目要求 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个 ...
- LeetCode 295. 数据流的中位数(大小堆)
文章目录 1. 题目 2. 大小堆解题 1. 题目 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 ...
- 76. Leetcode 295. 数据流的中位数 (堆-技巧一-固定堆)
技巧一 - 固定堆这个技巧指的是固定堆的大小 k 不变,代码上可通过每 pop 出去一个就 push 进来一个来实现.而由于初始堆可能是0,我们刚开始需要一个一个 push 进堆以达到堆的大小为k,因 ...
- 295. 数据流的中位数
295. 数据流的中位数 欢迎大家参加每日一题系列并提供其他版本,在你也可以按照相同格式提供你的最新的每日一题题解. 每日一题系列 题目描述: 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是 ...
- [LeetCode][C++]数据流的中位数
数据流的中位数 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一 ...
- 【leetcode】数据流的中位数
一.题目描述 中位数是有序整数列表中的中间值.如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值. 例如 arr = [2,3,4] 的中位数是 3 . 例如 arr = [2,3] 的中 ...
- 力扣—— 295. 数据流的中位数(困难)
目录 题目描述 问题分析 c++代码 题目描述 问题分析 使用大小堆来完成: 我们让最大堆总是大于最小堆一个量或者等于最小堆数量,中位数只可能是最大堆顶或最大堆与最小堆堆顶平均值. c++代码 cla ...
- LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现)
1. 题目 中位数是有序序列最中间的那个数. 如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) ...
- LeetCode 703. 数据流中的第K大元素(优先队列)
1. 题目 设计一个找到数据流中第K大元素的类(class). 注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...
最新文章
- 折返(Reentrancy)VS线程安全(Thread safety)
- 学数学或物理学到 high 很刺激,是一种怎样的经历与感受?
- Openlayers中点击地图获取坐标并输出
- Django的jinja2语法遇到jquery问题: defaultaddress is not defined
- SAP CRM读取产品主数据360度数据的API
- 自定义EventSource(一)EventCounter
- linux中检测用户信息的命令是,在Linux系统上检查用户所属组
- Participate in E-sports【Java大数+二分】
- mysql基本功能+show+innodb+索引+慢sql+explain
- Java 9 关注度不断上升!2018 编程语言流行度大调查
- matlab无穷积分求解_matlab编程求无穷限定积分
- 室内定位无GPS怎么办?阿木送来解决方案~
- 0030-用OpenCV的inpaint函数做图像的污点修复
- 货拉拉客户端通用日志组件 - Glog
- python数组内运算_Python数组介绍和操作运算详解
- 08 量子力学教材推荐,量子力学书单:量子力学、高等量子力学、量子统计、量子信息、路径积分...(适合物理专业本科生、研究生、物理爱好者)
- MD5加密是什么?为什么不可解密?
- JavaScript基本原理常识
- 每日加瓦,终成栋房4-final、内部类、权限修饰符
- 非华为手机可以刷鸿蒙系统吗,非华为手机用户,你愿意尝试鸿蒙系统吗?
热门文章
- HTML页面加载和解析流程详细介绍
- maven nexus 3 third party 构件上传
- 监听指定端口数据交互(HttpListenerContext )
- C/C++流程图生成器 C转流程图【worldsing笔记】
- SQL Server 数据库备份
- C++Primer学习笔记(二)
- OpenCV+python:Canny边缘检测算法
- axure动态登录和html5,Axure8原型设计实战案例:如何实现登录功能?
- 对于数据库进行设计在PHP,关于数据库表的设计
- java 多选列表框_快逸报表:填报中的下拉多选列表框