力扣——739.每日温度(单调栈)

一、题目描述

https://leetcode.cn/problems/daily-temperatures/

二、解题思路分析

先介绍一下什么是单调栈:

栈中元素组织形式要么是单调递减的,要么是单调递增的,这种形式的栈被称为单调栈。其中顺序的描述为从栈头到栈底的顺序。所以 单调栈可以用于解决在无序数组中找右边边第一个比当前小的或找右边第一个比当前大的元素。

刚好与这道题完美契合,所以核心思想:单调栈
对每个元素,快速找到它右边第一个比它大的元素的位置

使用栈的原因:
栈可以保存“尚未找到答案”的元素下标;
利用单调性减少无效比较。
单调规则:
我们维护一个从栈底到栈顶单调递减的栈(存储的是下标)。因为只要当前温度比栈顶高,就能“解决”栈顶的问题;否则当前温度也暂时无解,入栈等待。

因此,代码如下:

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        //使用一个栈进行元素缓存。找右边第一个比它大的,栈中元素单调递增(从头到尾的顺序)。
        //第一个元素可以直接入栈
        //遍历一个元素使用该元素与栈顶元素进行比较。如果当前元素比栈顶小就直接入栈。
        //如果当前元素比栈顶元素大,说明当前栈顶的元素找到了一个右边第一个比它大的数。这时候需要记录栈顶元素所需要的信息,记录完后删除栈顶元素。然后继续判断栈中元素直到当前元素放入栈中后符合单调递减。
        stack<int>stk;
        vector<int>res(temperatures.size());
        if(temperatures.size()<1) return res;

        stk.push(0);
        for(int i=1;i<temperatures.size();i++){
            if(!stk.empty()&&temperatures[i]<=temperatures[stk.top()]){
                stk.push(i);
            }
            else{
                while(!stk.empty()&&temperatures[i]>temperatures[stk.top()]){
                    res[stk.top()]=i-stk.top();
                    stk.pop();
                }
                stk.push(i);
            }
        }
        return res;

    }
};

这道题第一次接触还是有一些难度的,有一些细节还需要注意一下

1.栈中存的是下标,不是温度值。这个一开始我存的是温度值,但最后结果需要返回下标时我发现无法找到对应温度值的下标,但如果栈存下标的话,则可以通过下标找到温度值以此比较。

2.初始化结果数组为 0,未被更新的位置自然就是 0(无需额外处理)

3.while 循环条件不能漏 !stk.empty() 这个一定要注意空栈的问题,while循环处理很容易就会空栈,这时候如果使用了top()就会出错了

4.单调方向容易混淆
找“右边第一个更大的” → 单调递减栈
找“右边第一个更小的” → 单调递增栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值