单调栈

单调栈就是在先进后出的特性上加了栈内所有元素是单调递增的或者是单调递减的。

单调递增栈能表示入栈元素左边第一个比它大的元素

单调递减栈能表示入栈元素左边第一个比它小的元素

模板题

题干

给定一个长度为n的整数数组a,你需要求出每个元素的左边第一个比它小的元素。

输入

第一行:一个整数n。(1≤n≤2×10^5)

第二行:n个整数,表示整数数组a。(1≤ai​≤10^9)

输出

共一行,n个整数,表示每个元素的左边第一个比它小的元素,若不存在则为−1。

样例输入
1
2
5
7 8 5 6 7
样例输出
1
-1 7 -1 5 6

思路

由于这题给出的东西非常适合单调栈的操作,所以我们用单调栈来做,由于我们要取得是一个单调递增的数列,操作就是如果栈顶元素大于等于当前元素,那么就将栈顶元素删除,如果不是就直接push进去,地址存为栈顶元素。

ANSWER

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

constexpr int N = 2e5 + 10;

int a[N], l[N];//l[N]是记录第一个的value

void solve() {

int n;

cin >> n;

for (int i = 1; i <= n; i++) cin >> a[i];

stack<int> st;

for (int i = 1; i <= n; i++) {

while (st.size() && st.top() >= a[i]) st.pop();//不是单调性就删除

if (st.empty())

l[i] = -1;

else

l[i] = st.top();

st.push(a[i]);

}

for (int i = 1; i <= n; i++) cout << l[i] << ' ';

}

int main() {

ios::sync_with_stdio(0);

cin.tie(0);

cout.tie(0);

int t = 1;

while (t--) {

solve();

}

}

单调栈
https://ljw030710.github.io/2023/10/31/单调栈/
Author
iolzyy
Posted on
October 31, 2023
Licensed under