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

1、题目

力扣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 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;
    }
}

        

你可能感兴趣的:(leetcode,算法,数据结构,java)