单调栈
主要题型
给定一个序列,输出每一个数左边第一个比这个数小的一个数。
暴力做法
两层循环,逐个遍历每一个数,知道找到第一个比当前数据小的数为止。
代码表示
for(int i = 0; i < n; i ++ ){
for(int j = i; j >= 0; j -- ){
if(a[j] < a[i])
{
cout << a[j] << " ";
break;
}
if(j == 0){
cout << "-1 ";
}
}
}
算法思想
每次读入一个值,与栈顶进行比较,如果输入的值小于栈顶元素的值,则弹出栈顶元素,并继续遍历下一个栈顶元素,知道大于栈顶元素为止,保证最后形成的栈为一个单调递增的栈。
图解:(例如:3 4 2 7 9)
题目
题目链接
https://www.acwing.com/problem/content/832/
AC代码
学算法就上AcWing!!!
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int stk[N], tt = 0;
int main()
{
int n;
cin >> n;
while(n -- )
{
int x;
cin >> x;
// 逐个读入数据,和栈顶元素的值比较
// 如果当前的数据的值小于栈顶元素的值,那么弹出栈顶元素
while(x <= stk[tt]) tt --;
// 通过上面的循环,栈顶元素的值就是最小值
if(tt) cout << stk[tt] << " ";
// 如果栈内没有元素,输出 -1 即可
else cout << "-1" << " ";
// 操作完成之后将当前元素入栈
stk[ ++ tt ] = x;
}
return 0;
}