1、应用场景
找出一个数的左面离概述最近的且小于该数的数(同理右面也可以)
例如: 数组a[i] = 3 4 2 7 5 答案: -1 3 -1 2 2
2、如何实现找到规律
-
暴力写法:
-
for(int i=0;i<n;i++) { for(int j=i-1;j>=0;j--) { if(a[j] < a[i]) { cout << a[j] << endl; break; } } }
-
从上述写法中,我们可以找出一个性质,让一些元素用不到
-
例如:
3、例题:830. 单调栈 - AcWing题库
此图解源于acwing此题 题解!!!传送门
AC代码:
/*思路:
1、用暴力做法写一下,找出一种性质,使得某一个数字不会被使用掉
2、使其栈变为单调(单调增,单调减)
还需仔细读题,此题说的是左面第一个小于a[i]的
*/
#include<iostream>
using namespace std;
const int N = 100010;
int stk[N],tt;
int main()
{
int n;
scanf("%d", &n);
for(int i=0;i<n;i++)
{
int x;
scanf("%d", &x);
while(tt && stk[tt] >= x) tt--; //如果栈里有元素,待入栈元素小于栈顶元素,栈顶元素出栈
if(!tt) printf("-1 ");//如果栈里没元素就输出-1
else printf("%d ",stk[tt]); //输出左面第一个小于x(a[i])的数
stk[++tt] = x; //入栈
}
return 0;
}