力扣739. 每日温度:单调栈(详细注释)

1、题目

 2、理解题意      

        例如:
        对于输入 73,它需要 经过一天 才能等到温度升高到 74 ,所以对应的结果是 1。

        对于输入 74,它需要 经过一天 才能升温到 75 ,所以对应的结果是 1。

        对于输入 71,它经过 1 天后温度是 69,没有超过它,经过2天的时候温度升高到 72 ,所以对应的结果是 2 。

        对于输入 73,后续 没有温度 可以超过它,所以对应的结果是 0 。

        其他思路类似。

3、如何用单调栈实现

        单调栈适合的题目:要找到左边或者右边“第一个”比当前位置的数大或者小

        单调栈的含义:试着去竭力维护栈内元素的大小是“单调”的。

        只要有不单调的,那么就把栈顶的元素反复出栈,并且同时将相应结果存入res,直到又满足单调情况再入栈。
        具体步骤的解释可以参考代码注释:

class Solution {
    //单调栈适合的题目:要找到左边或者右边“第一个”比当前位置的数大或者小
    //
    //单调栈的含义:试着去竭力维护栈内元素的大小是“单调”的。
    //     只要有不单调的,那么就把栈顶的元素反复出栈,并且同时将相应结果存入res,直到又满足单调情况再入栈。
    //
    public int[] dailyTemperatures(int[] temperatures) {
        Deque<Integer> stack = new LinkedList<>();
        int len = temperatures.length, index = 0;
        int[] res = new int[len];
//维护一个从底到顶降序的单调栈。一旦不是升序,说明此元素比上一个小,满足题意,出栈并记录结果:
        for(int i = 0; i < len; i++){
            while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){//temperatures[i]比栈顶的元素还要大,说明找到了
//之所以用while,是因为可能出栈以后的栈顶元素仍然小于temperatures[i],继续记录结果。
//直到temperatures[i]放入栈中仍然满足单调栈,才可以放入stack,这就是单调栈的含义!
                int target_index = stack.pop();//找到了,那就把结果pop出去。
                res[target_index] = i - target_index;//存入结果
            }
            stack.push(i);
//temperatures[i]比上一个元素小了,或者栈都空了,这个时候可以push进stack,为单调栈。
        }
        return res;
    }
}

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好奇的7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值