LintCode之滑动窗口的中位数

本文介绍了如何使用LintCode解决滑动窗口内的中位数问题。当窗口大小为k时,对于数组[1,2,7,8,5],滑动窗口会依次返回中位数[2,7,7]。讨论了如何计算每个窗口内的中位数,并给出了样例解释。" 112444748,10554323,使用IDEA搭建SpringBoot项目(详细步骤),"['Spring框架', 'IDEA', 'SpringBoot开发', 'Web开发', '数据库集成']
摘要由CSDN通过智能技术生成

描述:给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。(如果数组中有偶数,则在该窗口存储该数字后,返回第 N/2-th 个数字。)
样例:
对于数组 [1,2,7,8,5], 滑动大小 k = 3 的窗口时,返回 [2,7,7]

最初,窗口的数组是这样的:

[ | 1,2,7 | ,8,5] , 返回中位数 2;

接着,窗口继续向前滑动一次。

[1, | 2,7,8 | ,5], 返回中位数 7;

接着,窗口继续向前滑动一次。

[1,2, | 7,8,5 | ], 返回中位数 7;

class Solution {
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) {
        // write your code here
        vector<int> vec;
        if(nums.size()<k) return vec;

    }

 void Insert(int num)
{
    if(((min.size()+max.size())&0x01)==0)//偶数时 ,放入最小堆 
    {
        if(max.size()>0 && num<max[0])
        {
            // push_heap (_First, _Last),要先在容器中加入数据,再调用push_heap ()
            max.push_back(num);//先将元素压入容器
            push_heap(max.begin(),max.end(),less<int>());//调整最大堆 
            num=max[0];//取出最大堆的最大值 
            //pop_heap(_First, _Last),要先调用pop_heap()再在容器中删除数据
            pop_heap(max.begin(),max.end(),less<int>());//删除最大堆的最大值 
            max.pop_back(); //在容器中删除 
        }
        min.push_back(num);//压入最小堆 
        push_heap(min.begin(),min.end(),greater<int>());//调整最小堆 
    }
    else//奇数时候,放入最大堆
    {
        if(min.size()>0 && num>min[0])
        {
            // push_heap (_First, _Last),要先在容器中加入数据,再调用push_heap ()
            min.push_back(num);//先压入最小堆 
            push_heap(min.begin(),min.end(),greater<int>());//调整最小堆 
            num=min[0];//得到最小堆的最小值(堆顶) 
            //pop_heap(_First, _Last),要先调用pop_heap()再在容器中删除数据
            pop_heap(min.begin(),min.end(),greater<int>());//删除最小堆的最大值 
            min.pop_back(); //在容器中删除 
        }
        max.push_back(num);//压入数字 
        push_heap(max.begin(),max.end(),less<int>());//调整最大堆 
    }   
}
private:
        vector<int> min;
        vector<int> max;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值