前言:今日遇到了双向单调栈的题,这里放出模板和题目,以备之后使用
简单介绍:单调栈的初始目的就是求在一个方向上小于 (或小于等于) 自身的第一个元素的值 (或下标),而双端单调栈便是分别求左右两边。双向单调栈在使用时需要注意一些边界条件,同时配合 前缀和 与 枚举 使用会有奇效。(不信你做题看看)
题目:LeetCode 84,LeetCode 1576, LeetCode 907
代码模板
vector<int> L(n), R(n);
// Calculate the array L
{
stack<int> s;
for(int i = 0; i < n; ++i){
while(s.size() and arr[i] <= arr[s.top()]){
s.pop();
}
L[i] = s.empty() ? -1 : s.top();
s.push(i);
}
}
// Calculate the array R
{
stack<int> s;
for(int i = n - 1; i >= 0; --i){
while(s.size() and arr[i] <= arr[s.top()]){
s.pop();
}
R[i] = s.empty() ? n : s.top();
s.push(i);
}
}