单调栈的应用场景
单调栈主要有三个应用:参考文章
- 应用一:找到每个元素后面比它大的第一个数:例Acwing 830单调栈
- 应用二:视野问题:例:牛的视野
- 应用三:接水问题例 leetcode 42. 接雨水
单调栈思想
下图是一个递增单调栈,在元素入栈前,先将其与当前的栈顶元素比较:图来自 https://www.acwing.com/solution/content/27437/
- 若当前元素大于栈顶元素,则入栈
- 若当前元素小于栈顶元素,则弹出栈顶元素,并重复1, 2步
核心代码
for (int i = 0; i < n; ++i)
{
int x;
scanf("%d", &x);
// 保持栈的单调性, 当栈不为空且栈顶元素大于等于x时弹栈
while (tt && stk[tt] >= x) tt--;
if (tt) printf("%d ", stk[tt]);
else printf("-1 ");
stk[ ++tt ] = x;
}