单调栈与单调队列算法总结

单调栈

知识概览

  • 单调栈最常见的应用是找到每一个数离它最近的且比它小的数。
  • 单调栈考虑的方式和双指针类似,都是先想一下暴力做法是什么,然后再挖掘一些性质如单调性,最终可以把目光集中在比较少的状态中,从而达到降低时间复杂度的作用,都是算法优化的一种手段。
  • 对于的情况,更有可能是答案,因此将删掉。最终,剩下的是严格单调上升的序列。

例题展示

题目链接

https://www.acwing.com/problem/content/832/

代码

复制代码
#include <iostream>

using namespace std;

const int N = 100010;

int n;
int stk[N], tt;

int main()
{
    scanf("%d", &n);
    
    for (int i = 0; i < n; i++)
    {
        int x;
        scanf("%d", &x);
        while (tt && stk[tt] >= x) tt--;
        if (tt) printf("%d ", stk[tt]);
        else printf("-1 ");
        
        stk[++tt] = x;
    }
    
    return 0;
}

单调队列

知识概览

  • 单调队列最经典的一个应用是求一下滑动窗口里的最大值或最小值。
  • 用数组模拟栈和队列的效率更高,这里用数组模拟。

例题展示

题目链接

https://www.acwing.com/problem/content/156/

代码

复制代码
#include <iostream>

using namespace std;

const int N = 1000010;

int n, k;
int a[N], q[N];

int main()
{
    scanf("%d%d", &n, &k);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    
    int hh = 0, tt = -1;
    for (int i = 0; i < n; i++)
    {
        // 判断队头是否已经滑出窗口
        if (hh <= tt && i - k + 1 > q[hh]) hh++;
        while (hh <= tt && a[q[tt]] >= a[i]) tt--;
        q[++tt] = i;
        if (i >= k - 1) printf("%d ", a[q[hh]]);
    }
    puts("");
    
    hh = 0, tt = -1;
    for (int i = 0; i < n; i++)
    {
        // 判断队头是否已经滑出窗口
        if (hh <= tt && i - k + 1 > q[hh]) hh++;
        while (hh <= tt && a[q[tt]] <= a[i]) tt--;
        q[++tt] = i;
        if (i >= k - 1) printf("%d ", a[q[hh]]);
    }
    puts("");
    
    return 0;
}
相关推荐
Victoria.a1 小时前
list容器(详解)
数据结构·c++·list
一只自律的鸡3 小时前
数据结构 树2
数据结构
某个默默无闻奋斗的人4 小时前
三傻排序的比较(选择,冒泡,插入)
java·数据结构·算法
敲上瘾5 小时前
BFS(广度优先搜索)——搜索算法
数据结构·c++·算法·搜索引擎·宽度优先·图搜索算法
JackieZhang.6 小时前
求水仙花数,提取算好,打表法。或者暴力解出来。
数据结构·算法
LUCIAZZZ7 小时前
Hot100之贪心算法
数据结构·算法·leetcode·贪心算法
h^hh7 小时前
堆的模拟实现(详解)c++
数据结构·c++·算法
tt5555555555557 小时前
每日一题——小根堆实现堆排序算法
c语言·数据结构·算法·面试·排序算法·八股文
捞鱼哲学家9 小时前
【hot100】刷题记录(11)-搜索二维矩阵 II
数据结构·线性代数·算法·leetcode·矩阵
利刃大大10 小时前
【数据结构与算法】九大排序算法实现详解
c语言·数据结构·c++·算法·排序算法