单调栈 单调队列

单调栈 —— 模板题 AcWing 830. 单调栈
常见模型:找出每个数左边离它最近的比它大/小的数
int tt = 0;
for (int i = 1; i <= n; i ++ )
{
while (tt && check(stk[tt], i)) tt -- ;
stk[ ++ tt] = i;
}

单调队列 —— 模板题 AcWing 154. 滑动窗口
常见模型:找出滑动窗口中的最大值/最小值
int hh = 0, tt = -1;
for (int i = 0; i < n; i ++ )
{
while (hh <= tt && a[q[t]] >= a[i] ) tt--//最小
q[++tt]=i;
if(q[hh] > i-k+1) hh++;
if(i>k) cout<<q[hh];
}

for (int i=1;i<=n;i++){
    //先输出数a[i]前的最小值
    if (q.empty()) //q空,即a[i]前没有元素
        printf("0\n");
    else { //否则判断队头是否需要出队并输出范围内的队头
        if (q.front().index+m<i) //队头已经超出滑动窗口范围
            q.pop_front(); // 弹出队头
        printf("%d\n",q.front().x); //此时队一定非空(想想为什么)
    }
    while ((!q.empty()) && q.back().x>=a[i]) 
    //当队列非空时,不断弹出队尾比当前元素大的元素
        q.pop_back();
    t.index=i;
    t.x=a[i];
    q.push_back(t);//将当前元素入队
    //注意:当前元素无论如何都会入队(想想为什么)
}
posted on 2025-01-13 20:21  下头小美  阅读(6)  评论(0)    收藏  举报