单调栈模版

作用:在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);
    }