Leetcode Hot100二刷-每日温度

这篇文章介绍了如何使用单调栈解决LeetCode题目739每日温度问题,通过遍历温度数组,维护一个单调递增的栈来找到每个温度后下一个更高温度出现的天数。作者还提到了单调栈在其他问题中的应用,如接雨水和柱状图中的最大矩形问题。
摘要由CSDN通过智能技术生成

739:每日温度

链接: Leetcode739.每日温度

题目需求

给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

思路

  1. 分析题干
    a. 题目要求的是在每一天记录下一个更高温度是在几天后。这就要求首先要知道每一天的索引,其次当发现下一个更高的温度时,可以及时做出反馈【第一步】
    b. 这时候用一个容器来存储每一天的温度,当下一个更高温度来临时,可以做出反馈,做出反馈后的温度无需保留。从上述描述来看,选栈是一个不错的选择【第二步】
    c. 抽象化第二步的描述,那就是遍历每一天的温度时,如果当前温度小于栈顶温度,那么就入栈等待。如果当前温度大于栈顶温度时,就开始弹出,直到栈里没有比当前温度更低的元素【第三步】
    d. 进一步抽象,从栈顶到栈底来看,这其实是在维护一个单调递增的序列,因此这个栈又叫单调栈【第四步】

  2. 写题顺序
    a. 创建一个栈
    b. 遍历数组,如果当前温度比栈顶温度低,则当前温度入栈;否则,开始出栈,收获结果

  3. 注意事项
    a. 栈存的是索引,不是元素值。因为最后返回的数组其实是索引之间的差值。

  4. 代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        if(temperatures.size() == 1) return vector<int>{0};
        stack<int> sta; // 索引
        sta.push(0);
        int idx = 1;
        vector<int> result(temperatures.size(), 0);
        while(!sta.empty() && idx < temperatures.size()){
            while(!sta.empty() && temperatures[idx] > temperatures[sta.top()]){
                result[sta.top()] = idx - sta.top();
                sta.pop();
            }
            sta.push(idx);
            idx++;
        }
        return result;
    }
};

题外话

单调栈还有很多的应用,包括解决接雨水、柱状图中最大的矩形等问题,代码随想录也有专门一章进行详细讲解

参考: 代码随想录-739.每日温度

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值