lintcode-81-数据流中位数
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 版权所有 堆 谷歌
思路
- 使用一个最大堆 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-数据流中位数的更多相关文章
- 问题: 数据流中位数 求解 时间复杂度度 java
今天练习了一题: 数据流中位数 问题描述:数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数. 案例: 持续进入数组的数的列表为:[1, 2, 3, 4, 5],则返回[1 ...
- 数据流中位数 · data stream median
[抄题]: 数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数. [思维问题]: [一句话思路]: 左边x个元素,右边要有x+1个元素,因此利用maxheap把左边的最大值 ...
- 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...
- lintcode算法周竞赛
------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...
- 7九章算法强化班全解--------Hadoop跃爷Spark
------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...
- 剑指offer ------ 刷题总结
面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. publi ...
- [OJ] Data Stream Median (Hard)
LintCode 81. Data Stream Median (Hard) 思路: 用一个大根堆保存较小的一半数, 一个小根堆保存较大的一半数. 每次根据num和两个堆顶的数据决定往哪个堆里面放. ...
- 【LeetCode】4、Median of Two Sorted Arrays
题目等级:Hard 题目描述: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find t ...
- 剑指Offer 1-41 代码(python实现)
今天主要写了一下offer 1-41题,余下的稍后整理 1 """ 1 镜像二叉树: 递归 """ def mirror(root): if ...
- fasd
基本排序算法 冒泡排序 没什么可说的, 改进方法就是加一个标志位防止有序后重复遍历. 由于需要遍历两次, 所以时间复杂度O(N^2) 传送门 --> 冒泡排序 选择排序 外层从0开始默认oute ...
随机推荐
- PANIC: HOME is defined but could not find Nexus_4_API_22.ini file in $HOME/.android/avd (Note: avd is searched in the order of $ANDROID_AVD_HOME,$ANDROID_SDK_HOME/.android/avd and $HOME/.android/avd)
sudo cp /root/.android/avd/*.ini $Home/.android/avd/ sudo cp -r /root/.android/avd/*.avd $Home/.a ...
- RHCE模拟考试
真实考试环境说明: 你考试所用的真实物理机器会使用普通账号自动登陆,登陆后,桌面会有两个虚拟主机图标,分别是system1和system2.所有的考试操作都是在system1和system2上完成.S ...
- 有关Laravel 4 的 Homestead 安装部署的细节
对于Vagrant,我是相见恨晚的.有时候抽出几个小时的时间学会一种工具,对于将来可以节省几十甚至几百小时的时间. Vagant最大的好处就是节省了安装配置运行环境的时间,统一开发环境,同时可以最大限 ...
- Scratch3.0设计的插件系统(上篇)
我们每个人在内心深处都怀有一个梦想: 希望创造出一个鲜活的世界,一个宇宙.处在我们生活的中间.被训练为架构师的那些人,拥有这样的渴望: 在某一天,在某一个地方,因为某种原因,创造出了一个不可思议的.美 ...
- 解决WCF传输的数据量过大问题
今天写了个WCF接口,然后自测通过,和别人联调时报 远程服务器返回错误: (413) Request Entity Too Large 错误!记得以前写的时候也出现过这个错误,大致解决办 ...
- 我们一起学习WCF 第二篇WCF承载多个接口
前言:现在王大叔养了大批猪,赚了很多钱.但是最近发现养鸡也可以赚很多钱,他就像扩展业务开始养鸡.又过两年他发现市场对狗的需求量很大,他开始养狗.那么他改怎么做呢,不可能去修改猪住的地方把鸭子和狗放里面 ...
- 自动化之UI(autoit)
自动化 说到自动化,我真的很不喜欢UI这层去做实践.前置条件要求比较严谨,如果不满足特定的前置条件,那么成本实在太大了. 投入与产出差过大,效果打折扣.从互联网来说,UI自动化是入门门槛很低的一种实践 ...
- katalon系列十五:给浏览器添加cookie自动登陆
import org.openqa.selenium.Cookieimport org.openqa.selenium.WebDriverimport com.kms.katalon.core.web ...
- POJ 2251 Dungeon Master (三维BFS)
题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total S ...
- Phaser3 场景Scene之间的传值 -- HTML JAVASCRIPT 网页游戏开发
PHASERJS3 一.首先当然得有至少有二个场景sceneA.js,sceneB.js 二.从场景A传值到场景B二种方法 1)通过事件this.events.emit('event key',{ ...