算法学习单调栈之每日温度

Problem: 739. 每日温度

首先最直观的思路就是两层循环遍历寻找第一个比当前温度高的,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

接下来介绍单调栈的两种思路:

单调栈就是用来解决求一个元素左/右第一个最大/小的元素
单调栈就是一个栈,只是我们需要维护使得栈的内部存储元素是有序的,例如一个栈从栈顶到栈底 15 30 60,此时再来元素40,就需要把15,30pop出再把40入栈以此维护栈的单调性。
单调栈的作用就是用来记录前面访问元素中遍历过的元素

1.从右往左遍历

就像是横看成岭侧成峰, 寻找比当前大的元素,就相当于一眼看过去能看到的高山,低矮的山是无法看见的,所以我们无需维护小的元素。

此时栈内部维护的是当前下标左侧的可能的高温的值,以30,50,40,50,,50,60,40为例,栈内40,60入栈时,由于40比60小,所以60的下一个高温不可能是40,无需维护。
最后记录答案 栈顶元素下标 - 当前元素下标

2.从左往右遍历

从左到右单调栈内维护的就不再是可能的高温了,而是还未寻找到下一个高温的元素下标,而我们遍历到比栈顶温度高的就要把栈顶元素出栈并记录答案 当前元素下标 - 栈顶元素下标

总结

我们可以发现,从左到右和从右到左是思考的方式是不一样的,单调栈内维护的内容也不同,从右到左,栈内维护下一次的高温,从左往右维护未寻找到下一次高温 ,是一个事物的两个方面。

时间复杂度 O ( n ) O(n) O(n)

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> st;
        int n = temperatures.size();
        vector<int> ans(n);
        //从左到右
        /*for(int i = 0; i < n; i++)
        {
            int t = temperatures[i];
            while(!st.empty() && t > temperatures[st.top()])
            {
                int j = st.top();
                st.pop();
                ans[j] = i - j;
            }
            st.push(i);
        }
        return ans;*/
        //从右往左
        for(int i = n - 1; i >= 0; i--)
        {
            int t = temperatures[i];
            while(!st.empty() && t >= temperatures[st.top()])
            {
                st.pop();
            }
            if(!st.empty())
            {
                ans[i] = st.top() - i;
            }
            st.push(i);

        }
        return ans;
    }
};
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值