单调栈模版
作用:在O(n)的时间内找到元素左/右侧比它大/小的元素。
STL容器模版
左侧离该元素最近的比它的元素
//左侧最近比该元素大的元素
vector<int> nums={2,1,23,21,5};
int n=nums.size();
vector<int> left(n);
stack<int> st;
//维护一个递减栈
for(int i=0;i<n;i++){
int x=nums[i];
//把比x大或相等的元素弹出栈
while(!st.empty() && nums[st.top()]<=x){
st.pop();
}
//记录答案:栈顶元素就是左侧第一个比x大的元素
left[i]=st.top();
st.push(i);
}
右侧离该元素最近的比它的元素(倒序遍历,形式上上面一样)
//右侧最近比该元素小的元素
vector<int> nums={2,1,23,21,5};
int n=nums.size();
vector<int> right(n);
stack<int> st;
st.push(n);
for(int i=n-1;i>0;i--){
int x=nums[i];
while(!st.empty() && nums[st.top()]<=x){
st.pop();
}
right[i]=st.top();
st.push(i);
}