单调栈

830. 单调栈 - AcWing题库

单调栈的概念: 单调栈是的一种特殊的形式,在栈中的元素必须满足单调性(一定是上升或单调下降的规律)

简单点来说就是必须让元素满足单调性, 那么每次插入和栈顶作比较。如果不满足某些性质,直接弹出栈顶, 直到栈为空或满足该性质插入这个元素。

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int stk[N], tt;


int main () {
int m;
cin >> m;
while (m-- ) {
int x;
cin >> x;
while (tt && stk[tt] >= x) tt--;
if (tt) cout << stk[tt] << ' ';
else cout << "-1 ";
stk[++tt] = x;
}

return 0;


}

单调队列

154. 滑动窗口 - AcWing题库

单调队列的概念: 单调队列是队列的一种, 作用是能在问题中抽象出模型,找出单调性 求出极值优化

也就是在队列中及时取出无效的状态, 尽早删除(也就是无法更新答案 一定没有贡献)

AC代码:

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
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int a[N], q[N];

int main () {
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
//判断队头是否已经滑出窗口
int hh = 0, tt = -1; // 定义队头和队尾
for (int i = 0; i < n; i++){
// 判断队头是否滑出窗口
if (hh <= tt && i - k + 1 > q[hh]) hh++; // 每次只有1个数被移除窗口
while (hh <= tt && a[q[tt]] >= a[i]) tt--; // 如果新插入的数比队尾的数小就把队尾删除
q[++tt] = i;
if (i >= k - 1) cout << a[q[hh]] << ' ';

}

cout << '\n';


hh = 0, tt = -1; // 定义队头和队尾
for (int i = 0; i < n; i++){
// 判断队头是否滑出窗口
if (hh <= tt && i - k + 1 > q[hh]) hh++; // 每次只有1个数被移除窗口
while (hh <= tt && a[q[tt]] <= a[i]) tt--;
q[++tt] = i;
if (i >= k - 1) cout << a[q[hh]] << ' ';

}

cout << '\n';






}