单调栈

2021-11-28 常用算法

视频讲解及更多习题见:【算法精讲系列】基础数据结构:单调栈 (opens new window)

# 一、算法思想

单调栈,就是所有元素始终保持一定的单调性的栈。

常见模型为:找出每个数左边离它最近的比它大 / 小的数。

# 二、算法模板

C++

    # 三、代码实战

    # AcWing 0830


    题目:单调栈

    给定一个长度为 NN 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 1−1

    输入格式

    第一行包含整数 NN,表示数列长度。

    第二行包含 NN 个整数,表示整数数列。

    输出格式

    共一行,包含 NN 个整数,其中第 ii 个数表示第 ii 个数的左边第一个比它小的数,如果不存在则输出 1−1

    数据范围

    1N1051 \le N \le 10^5
    1数列中元素1091 \le \text{数列中元素} \le 10^9

    输入样例:

    5

    3 4 2 7 5

    输出样例:

    -1 3 -1 2 2

    解答代码:

    #include <iostream>
    
    using namespace std;
    
    const int N = 100010;
    
    int stk[N], tt = 0;
    
    int main()
    {
        int n;
        cin >> n;
        
        while (n--) {
            int x;
            scanf("%d", &x);
            
            while (tt && stk[tt] >= x) tt--;
            if (!tt) printf("-1 ");
            else printf("%d ", stk[tt]);
            
            stk[++tt] = x;
        }
        
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Last Updated: 2023-01-28 4:31:25