81-数据流中位数

数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数。

说明

中位数的定义:

中位数是排序后数组的中间值,如果有数组中有n个数,则中位数为A[(n-1)/2]。

比如:数组A=[1,2,3]的中位数是2,数组A=[1,19]的中位数是1。

样例

持续进入数组的数的列表为:[1, 2, 3, 4, 5],则返回[1, 1, 2, 2, 3]

持续进入数组的数的列表为:[4, 5, 1, 3, 2, 6, 0],则返回 [4, 4, 4, 3, 3, 3, 3]

持续进入数组的数的列表为:[2, 20, 100],则返回[2, 2, 20]

挑战

时间复杂度为O(nlogn)

标签

优先队列 LintCode 版权所有 堆 谷歌

思路

参考http://www.cnblogs.com/easonliu/p/4441916.html

  • 使用一个最大堆 maxSet 与最小堆 minSet( maxSet 用 multiset 的反向遍历代替)。maxSet 存的是到目前为止较小的那一半数,minSet 存的是到目前为止较大的那一半数,这样中位数只有可能是 maxSet 的堆顶元素(本题中)或者是两个堆顶元素的均值。
  • minSet与maxSet交替使用,保证两个堆的大小之差不超过1。
  • 当插入一个新数时,若新数大于 minSet 的堆顶元素,说明新数在所有数的下半部分,此时将新数插入 minSet,取出 minSet 堆顶元素并插入至 maxSet ;否则,说明新数在所有数的上半部分,将新数插入 maxSet
  • 当插入一个新数时,若新数小于 maxSet 的堆顶元素,说明新数在所有数的上半部分,此时将新数插入 maxSet,取出 maxSet 堆顶元素并插入至 minSet ;否则,说明新数在所有数的下半部分,将新数插入 minSet
  • 将 maxSet 堆顶元素存入返回值数组,但不取出堆顶元素

code

class Solution {
public:
/**
* @param nums: A list of integers.
* @return: The median of numbers
*/
vector<int> medianII(vector<int> &nums) {
// write your code here
int size = nums.size();
if (size <= 0) {
return vector<int>();
}
// maxSet存的是到目前为止较小的那一半数,minSet存的是到目前为止较大的那一半数
// maxSet使用反向遍历,达到最大堆效果
multiset<int> minSet, maxSet;
vector<int> result;
bool flag = true;
for (int i = 0; i < size; i++) {
int temp = nums[i];
// minSet与maxSet交替使用,保证两个堆的大小之差不超过1
if (flag) {
// 新数大于minSet的堆顶元素时,说明新数在所有数的下半部分
if (!minSet.empty() && nums[i] > *minSet.begin()) {
minSet.insert(nums[i]);
temp = *minSet.begin();
minSet.erase(minSet.find(temp));
}
// 新数小于minSet的堆顶元素时,说明新数在所有数的上半部分
// 或将原minSet的堆顶元素放在maxSet中
maxSet.insert(temp);
}
else {
// 新数小于minSet的堆顶元素时,说明新数在所有数的上半部分
if (!maxSet.empty() && nums[i] < *maxSet.rbegin()) {
maxSet.insert(nums[i]);
temp = *maxSet.rbegin();
maxSet.erase(maxSet.find(temp));
}
// 新数大于minSet的堆顶元素时,说明新数在所有数的下半部分
// 或将原maxSet的堆顶元素放在minSet中
minSet.insert(temp);
}
flag = !flag;
result.push_back(*maxSet.rbegin());
}
return result;
}
};

lintcode-81-数据流中位数的更多相关文章

  1. 问题: 数据流中位数 求解 时间复杂度度 java

    今天练习了一题: 数据流中位数 问题描述:数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数. 案例: 持续进入数组的数的列表为:[1, 2, 3, 4, 5],则返回[1 ...

  2. 数据流中位数 · data stream median

    [抄题]: 数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数. [思维问题]: [一句话思路]: 左边x个元素,右边要有x+1个元素,因此利用maxheap把左边的最大值 ...

  3. 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)

    注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...

  4. lintcode算法周竞赛

    ------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...

  5. 7九章算法强化班全解--------Hadoop跃爷Spark

    ------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...

  6. 剑指offer ------ 刷题总结

    面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. publi ...

  7. [OJ] Data Stream Median (Hard)

    LintCode 81. Data Stream Median (Hard) 思路: 用一个大根堆保存较小的一半数, 一个小根堆保存较大的一半数. 每次根据num和两个堆顶的数据决定往哪个堆里面放. ...

  8. 【LeetCode】4、Median of Two Sorted Arrays

    题目等级:Hard 题目描述:   There are two sorted arrays nums1 and nums2 of size m and n respectively.   Find t ...

  9. 剑指Offer 1-41 代码(python实现)

    今天主要写了一下offer 1-41题,余下的稍后整理 1 """ 1 镜像二叉树: 递归 """ def mirror(root): if ...

  10. fasd

    基本排序算法 冒泡排序 没什么可说的, 改进方法就是加一个标志位防止有序后重复遍历. 由于需要遍历两次, 所以时间复杂度O(N^2) 传送门 --> 冒泡排序 选择排序 外层从0开始默认oute ...

随机推荐

  1. Homebrew(brew)安装MySQL成功后无法登录

    Homebrew简称brew,OSX上的软件包管理工具,在Mac终端可以通过brew安装.更新.卸载各种软件,(简直就是神器级武器). 废话不多说,没安装brew自己去百度学习安装,这里就不多说了. ...

  2. Dynamics CRM plugin调试方法之Profiler

    https://blog.csdn.net/vic0228/article/details/72903815

  3. microPython环境安装及使用

    1.ESP8266_12E(NodeMCU1.0)(AI Thinker)板Arduino IDE环境安装 (1)方法1(自动安装,windows,mac,linux平台都可) http://ardu ...

  4. linux不重启挂载磁盘安装grub

    挂载.分区.grub 通过给一块新磁盘安装grub回顾磁盘挂载.分区文件系统创建等操作: 该实验基于(CtonOS6.8:kernel:2.6.32-642.15.1.el6.x86_64) 1.通过 ...

  5. jenkins+maven+docker集成java发布(二)#远程发布

    jenkins+maven+docker集成java发布(一)中写了在Jenkins服务器自动部署业务,那需要将java项目部署到其他服务器怎么操作 这里需要依赖插件Publish Over SSH ...

  6. Angular Elements

    Angular Elements Angular Elements 就是打包成自定义元素的 Angular 组件.所谓自定义元素就是一套与具体框架无关的用于定义新 HTML 元素的 Web 标准. 自 ...

  7. sqlserver之on与where条件

    在进行两个表乃至多个表进行联接时需要on条件进行匹配,很多时候我们会对过滤条件放在on还是where中心存疑惑.一般来讲,在外联接中on是两个表进行关联的匹配条件,在该条件匹配下会生成一个虚拟表. 如 ...

  8. SQL学习笔记:函数

    SQL函数 AVG select AVG(col) AS avgvalue from tablename select col2 from tablename where col1>(selec ...

  9. 20155226 2016-2017-2 《Java程序设计》第4周学习总结

    20155226 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承(extends): 1.作用:提高代码复用性 让类与类产生了关系,有了这个关系才有了多 ...

  10. 预备作业03: 初体验---虚拟机virtual box

    学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 昨天从下午到晚上一直在研究怎么安装也问了很多同学,也自己查了查百度,经过一晚上终于安装成功,于是今天一早 ...