单调栈

单调栈是一种和单调队列类似的数据结构。单调队列主要用于解决滑动窗口问题,单调栈则主要用于解决NGE问题(Next Greater Element),也就是,对序列中每个元素,找到下一个比它大的元素。(当然,“下一个”可以换成“上一个”(对于序列的正序、反序遍历),“比它大”也可以换成“比他小”,原理不变。(当前元素与栈顶元素的大小关系的设定))

这比单调队列还简单一点。我们维护一个栈,表示“待确定NGE的元素”,然后遍历序列。当我们碰上一个新元素,我们知道,越靠近栈顶的元素离新元素位置越近。所以不断比较新元素与栈顶,如果新元素比栈顶大,则可断定新元素就是栈顶的NGE,于是弹出栈顶并继续比较。直到新元素不比栈顶大,再将新元素压入栈。显然,这样形成的栈是单调递减的。

vector<int> dailyTemperatures(vector<int>& t) {
        stack<int> stk;
        vector<int> res(t.size(), 0);
        for(int i = 0; i < t.size(); i++){
            while(!stk.empty() && t[stk.top()] < t[i]){
                res[stk.top()] = i;
                stk.pop();
            }
            stk.push(i);
        }
        return res;
    }
posted @ 2023-04-01 17:12  热情奔放deme  阅读(19)  评论(0编辑  收藏  举报
/* 设置动态特效 */ TOP 底部