代码随想录——单调栈

单调栈

要求「从 栈顶栈底 的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。(有的文章是从栈底到栈顶,本文默认从栈顶到栈底)

怎么能想到用单调栈呢? 什么时候用单调栈呢?

  • 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)

  • 如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。

实际使用根据需求:需要当前元素比栈顶小时才能入栈,说明是一个单调递增栈。

如下面例题,找右边第一个更大元素。如果当前元素小于等于栈顶,说明没找到,如果大于栈顶说明对于栈顶找到了,栈顶就要出栈,同时计算位置。

每日温度

image

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> result(n,0);
        stack<int> st;// 找右边第一个比t[i]大的,单调递增栈(栈顶到栈底) / 只有小于等于栈顶才能入栈
        st.push(0);// 栈存放数组下标——方便计算天数
        for(int i=1;i<n;i++){
            while(!st.empty() && temperatures[i] > temperatures[st.top()]){// 栈不能为空!
                result[st.top()] = i - st.top();
                st.pop();
            }
            st.push(i);
        }
        return result;
    }
};
posted @ 2025-02-05 10:30  NeroMegumi  阅读(26)  评论(0)    收藏  举报