单调栈
定义
- 单调栈就是 栈内元素单调递增 或者 单调递减的 栈
- 并且只能在栈顶操作 (入栈和出栈)
- 单调栈的维护是O(n)的时间复杂度,所有元素只会 进栈一次
解题基本思想
用途:用于求 从左/右 遍历 得到第一个 比 它 小/大的元素的位置
元素 在出栈时 考虑 右侧边界(即右侧边界不符条件时 ,元素出栈)
在入栈时 考虑 左侧边界 (栈内为单调序列,左侧边界相对固定)
实现方式
1.单调递增栈 : 从栈底到 栈顶 元素 序列单调 递增 (栈顶为 最大值)
作用:获取离当前位置最近的一个小于当前值的元素的 位置。
(也可确定某个元素 在 一定长度 的 区间中 做最小值 )
2.单调递减栈 : 从栈底到 栈顶 元素 序列单调 递减 (栈顶为 最小值)
作用:获取离当前位置最近的一个大于当前值的元素的 位置。
(也可确定某个元素 在 一定长度 的 区间中 做最大值 )
/*
* 单调 递增栈
*/
stack<int > s;
for(int i=0;i<n;i++)
{
while(!s.empty()&&a[s.top()]>a[i]) // 维护 递增栈
{
// 对s.top() 的相关元素 进行操作
s.pop();
}
s.push(i);
}
/*
* 单调 递减栈
*/
stack<int > s;
for(int i=0;i<n;i++