栈 滑动窗口c++

由以下这个代码让我深深的感知了一下
就是1.我自己心里面得有一个想法就是是下标问题  得移动  就是一旦发现可以后移动之后就开始移动   
2.在移动这个地方要知道就是q[++tt]其实这个地方挺神奇的因为这个地方就是相当于不停的可移动可以很随意的移动  相当于这个是一个动态的指针   而那个hh就是一个不怎么动的指针 
3.我个人认为对于这个代码不是特好理解  背吧  就是那几个比较重要的点

总体思路就是1.首先先判断左边界
2.如果这个数不是单调递升怎么办
3.不断更新这个tt指针的坐标
4.要是能输出就直接输出

# include <iostream>
using namespace std;
const int N = 1000010;
int a[N], q[N], hh, tt = -1;

int main()
{
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; ++ i)
    {
        cin >> a[i];
        if (i - k + 1 > q[hh]) ++ hh;                  // 若队首出窗口,hh加1
        while (hh <= tt && a[i] <= a[q[tt]]) -- tt;    // 若队尾不单调,tt减1
        q[++ tt] = i;         
        cout <<" 下标移动" << hh << " " << tt << endl;
        cout <<"代表的值" << q[hh] << " " << q[tt] << endl;
        // 下标加到队尾
        if (i + 1 >= k)cout << a[q[hh]] << endl;
        
     
        // 输出结果
    }
    cout << endl;
    //hh = 0; tt = -1;                                   // 重置!
    //for (int i = 0; i < n; ++ i)
    //{
    //    if (i - k + 1 > q[hh]) ++ hh;
    //    while (hh <= tt && a[i] >= a[q[tt]]) -- tt;
    //    q[++ tt] = i;
    //    if (i + 1 >= k) printf("%d ", a[q[hh]]);
    //}
    return 0;
}

其实会看这个代码和上篇文章的那个代码挺像都是这种单调的栈  只不过这个栈是就指定的范围求这个最值  上一篇文章是一个相对来说范围不是问题

然而这篇文章这个范围很重要

你在仔细品品  代码核心部分几乎一模一样

其实有的时候对于这个种类行的题一也可以理解为下标掩盖  (如果你认为我理解的有毛病请及时提出,并给出你的理解,谢谢)

以上这个代码借鉴别人写的 不是本人

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值