acwing 154滑动窗口

本文介绍了一种使用双端队列实现的滑动窗口算法,该算法能够高效地找到给定数组中每个长度为 k 的子数组的最大值和最小值。通过维护两个双端队列来跟踪当前窗口内的最大值和最小值候选元素,确保队列前端始终是最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include<bits/stdc++.h>

using namespace std;

int n, k;

deque<int> fax, fin;
vector<int> num(1000010);

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    freopen(".in", "r", stdin);

    cin >> n >> k;

    for (int i = 1; i <= n; i++)
        cin >> num[i];
    
    for (int i = 1; i <= n; i++)
    {
        if(fax.size())
            if (fax.front() < i - k + 1)
                fax.pop_front();

        if(fax.size())    
            while (fax.size() && num[fax.back()] > num[i])
            fax.pop_back();

        fax.push_back(i);
        if (i >= k)
            cout << num[fax.front()] << ' ';

    }


    cout << endl;
    for (int i = 1; i <= n; i++)
    {
        if (fin.size())
            if (fin.front() < i - k + 1)
                fin.pop_front();

        if (fin.size())
            while (fin.size() && num[fin.back()] < num[i])
                fin.pop_back();

        fin.push_back(i);
        if (i >= k)
            cout << num[fin.front()] << ' ';
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值