LintCode "Sliding Window Median" & "Data Stream Median"
Besides heap, multiset<int> can also be used:
class Solution {
    void removeOnly1(multiset<int> &ms, int v)
    {
        auto pr = ms.equal_range(v);
        ms.erase(pr.first);
    }
    void remove(multiset<int> &lmax, multiset<int> &rmin, int v)
    {
        if(v <= *lmax.rbegin())
        {
            removeOnly1(lmax, v);
            if(lmax.size() < rmin.size())
            {
                int tmp = *rmin.begin();
                lmax.insert(tmp);
                removeOnly1(rmin, tmp);
            }
        }
        else if(v >= *rmin.begin())
        {
            removeOnly1(rmin, v);
            if((lmax.size() - rmin.size()) > )
            {
                int tmp = *lmax.rbegin();
                removeOnly1(lmax, tmp);
                rmin.insert(tmp);
            }
        }
    }
    void addin(multiset<int> &lmax, multiset<int> &rmin, int v)
    {
        if(lmax.empty())
        {
            lmax.insert(v);
            return;
        }
        int lmax_v = *lmax.rbegin();
        int size_l = lmax.size(), size_r = rmin.size();
        if(v <= lmax_v) // to add left
        {
            lmax.insert(v);
            if((size_l +  - size_r) > )
            {
                int tmp = *lmax.rbegin();
                rmin.insert(tmp);
                removeOnly1(lmax, tmp);
            }
        }
        else
        {
            rmin.insert(v);
            if((size_r  + )> size_l)
            {
                int tmp = *rmin.begin();
                removeOnly1(rmin, tmp);
                lmax.insert(tmp);
            }
        }
    }
public:
    /**
     * @param nums: A list of integers.
     * @return: The median of the element inside the window at each moving
     */
    vector<int> medianSlidingWindow(vector<int> &nums, int k) {
        vector<int> ret;
        multiset<int> lmax, rmin; // sizeof(lmax) - sizeof(rmin) -> [0,1]
        size_t n = nums.size();
        for(int i = ; i < n; i ++)
        {
            if(i >= k)
            {
                remove(lmax, rmin, nums[i - k]);
            }
            //
            addin(lmax, rmin, nums[i]);
            //
            if(i >= k - )
            {
                ret.push_back(*lmax.rbegin());
            }
        }
        return ret;
    }
};
LintCode "Sliding Window Median" & "Data Stream Median"的更多相关文章
- lintcode 1: Data Stream Median
		
Data Stream Median Numbers keep coming, return the median of numbers at every time a new number adde ...
 - [OJ] Data Stream Median (Hard)
		
LintCode 81. Data Stream Median (Hard) 思路: 用一个大根堆保存较小的一半数, 一个小根堆保存较大的一半数. 每次根据num和两个堆顶的数据决定往哪个堆里面放. ...
 - 数据流中位数 · data stream median
		
[抄题]: 数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数. [思维问题]: [一句话思路]: 左边x个元素,右边要有x+1个元素,因此利用maxheap把左边的最大值 ...
 - LintCode Sliding Window Matrix Maximum
		
原题链接在这里:http://www.lintcode.com/zh-cn/problem/sliding-window-matrix-maximum/ 题目: Given an array of n ...
 - Lintcode360 Sliding Window Median solution 题解
		
[题目描述] Given an array of n integer, and a moving window(size k), move the window at each iteration f ...
 - [LeetCode] Find Median from Data Stream
		
Find Median from Data Stream Median is the middle value in an ordered integer list. If the size of t ...
 - [LeetCode] Sliding Window Median 滑动窗口中位数
		
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
 - Sliding Window Median LT480
		
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
 - LeetCode295-Find Median from Data Stream && 480. 滑动窗口中位数
		
中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操 ...
 
随机推荐
- 继承自CCObject的对象成员变量出错或者为空的问题
			
写了个类想让其作为某种数据集合,还可以自动销毁,所以就直接继承了最底层的CCObject,所以并不属于视图,也就不会被addChild到显示列表里,于是就造成了接下来遇到的一个情况:其所有的成员变量被 ...
 - NetCDF 格式化数据概述
			
前言 马上要开始新的项目了.气象局方面要求处理的数据是 NetCDF 格式的,这是一种封装好了的数据结构,需要连接一些库,调用特定的 API 进行操作. 可这方面我知之甚少,遂利用周日上午的时间学习这 ...
 - 织梦dedecms模板调用标签大全-提高制作模板速度
			
关键描述调用标签: ——————————————————————————–模板路径调用标签: {dede:field name=’templeturl’/}—————————————————————— ...
 - Open经验库网址
			
http://www.open-open.com/lib/view/open1436094840774.html
 - 工作中遇到的问题--使用DTO减少数据字段
			
Location中包含如下字段以及AMfgObject中关于创建信息的字段,然而有时使用并不需要传输那么多数据,则对其中字段进行过滤. @Entity@Table(name = "LOCAT ...
 - 按Right-BICEP的测试用例
			
测试方法:Right-BICEP 测试计划 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.P-是否满足性能要求? 4.结果是否有符合要求的20道题目? 5.所得到的最大数 ...
 - E:nth-child(n)实现奇偶匹配
			
<style> li:nth-child(2n){color:#f00;} /* 偶数 */ li:nth-child(2n+1){color:#000;} /* 奇数 */ </s ...
 - about java techelogly
			
https://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html Differences between Java EE ...
 - solr 主从模式和solrcloud集群模式
			
主从模式 主节点有单点故障问题:没有主从自动切换,没有failover,主机down掉了的话,整个数据变成只读.并且需要一台机单独做索引,浪费资源,所有数据都需要在这台机器上单独存在一份,索引变化较大 ...
 - Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
			
一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封 ...