【每日一题】单调队列、滑动窗口最大最小值

https://ac.nowcoder.com/acm/problem/50528
滑动窗口最大最小值

单调队列板子题

求最大值和求最小值分别维护一个单减和单增队列即可,队列内保存数组下标(方便判断是否在滑动窗口内),我这里使用deque使用

以求最大值为例:

队列的最前端是此次遍历的最大值的下标
当我们遇到新的数时,将新的数和双项队列的末尾比较,如果末尾比新数小,则把末尾扔掉,直到该队列的末尾比新数大或者队列为空的时候才停止
双项队列中的所有值都要在窗口范围内

#include 
using namespace std;
vector maxres;
vector minres;
void Window(vector nums, int k)
{
    deque dec;
    deque inc;
    for (int i = 0; i < k; ++i)
    {
        while (!dec.empty() && nums[i] > nums[dec.back()])
        {
            dec.pop_back();
        }
        while (!inc.empty() && nums[i] < nums[inc.back()])
        {
            inc.pop_back();
        }
        dec.push_back(i);
        inc.push_back(i);
    }
    maxres.push_back(nums[dec.front()]);
    minres.push_back(nums[inc.front()]);
    for (int i = k; i < nums.size(); ++i)
    {
        if (!dec.empty() && dec.front() <= i - k)
        {
            dec.pop_front();
        }
        if (!inc.empty() && inc.front() <= i - k)
        {
            inc.pop_front();
        }
        while (!dec.empty() && nums[i] > nums[dec.back()])
        {
            dec.pop_back();
        }
        while (!inc.empty() && nums[i] < nums[inc.back()])
        {
            inc.pop_back();
        }
        dec.push_back(i);
        inc.push_back(i);
        maxres.push_back(nums[dec.front()]);
        minres.push_back(nums[inc.front()]);
    }
    return;
}
void PPrint(){
    int len=minres.size();
    for(int i=0;i<len;++i){
        cout<<minres[i]<<" ";
    }
    cout << endl;
    len=maxres.size();
    for(int i=0;i<len;++i){
        cout<<maxres[i]<<" ";
    }
}
int main()
{
    int n, k;
    cin >> n >> k;
    vector nums(n, 0);
    for (int i = 0; i < n; ++i)
        cin >> nums[i];
    Window(nums,k);
    PPrint();
}
全部评论

相关推荐

序&nbsp;朋友们,好久不见。&nbsp;笔者在过去消失的五个月里被困在情绪牢笼中过的相当煎熬,一度丢失自己,觉得整个世界都是昏暗的。&nbsp;庆幸的是靠着自己纯硬扛也是走出来了。表达欲再度回归,所以真的很开心还有机会能在再和大家见面。&nbsp;破碎秋招&nbsp;抑郁情绪的引爆点必然是秋招期间遭受的打击了,从去年九月份腾讯转正被告知失败之后就开始疯狂投递简历,每天都在经历:简历挂、一面挂、二面挂、三面挂、HR面挂,每天睁开眼就被无所适从的挫败感包围。&nbsp;秋招的特点是即便流程走到最后一步也不一定会&nbsp;offer,因为还需要进入大池子进行横向对比,俗称泡池子,而这一泡我的大多数面试流程到后面就没了后文,这一度让我感觉非常绝望。我深知自己学历并...
SoNiC_X:我已经工作快2年了,当时高考没考好没去到想去的学校,觉得天要塌了;校招找不到工作,觉得天要塌了;现在工作觉得看不到未来,觉得天要塌了;最近最大的感悟就是:天会一直塌,但是生活也会一直继续下去,还是要调整好自己的心态,不要因为一时的困难把自己困住,要记住完蛋的日子永远在后头
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务