【Vigor】leetcode刷题 -- 739. 每日温度(java)

题目:

每日温度

题意理解:

  • 依据题意,需要查找到下一个温度更高的日子距当前有多少天
  • 比如有三天温度:73 56 74 ,则距 73 后 74 比其温度更高,而 73 之后需要等待 2 天才到 74 ,所以 73 对应的数组值为 2 .

解题思路:

  • 我们可以遍历一遍所给的温度数组,因为遍历过的元素可能对后面的元素产生影响,所以可以考虑使用 这种数据结构进行解题。

  • 在遍历的过程中,我们存储在栈中的值为该元素的数组下标。

  • 当当前元素比栈顶元素大,则证明找到了至少一个温度升高的“迹象”,则将栈顶元素取出。

  • 当前元素下标 - 取出的栈顶元素值 = 栈顶元素需要等待更高温的天数。

  • 注意点:

  • 使用判断 “!stack.isEmpty()” 当栈中无元素时,直接将元素入栈,另外,当元素和栈顶元素相等时,也需要将该元素进栈,这样做也很好地解决了刚开始栈中无元素,第一个元素的去向

  • 当遍历完所给数组元素时,有可能出现栈中还有元素的情况,当并不影响结果,这些在栈中的元素下标的结果值分别都为 0 ,因为没有下一个比其更高的温度存在。而若我们刚开始通过创建一个 int 类型的数组来存储等待天数,因为基本数据类型的数组值默认为 0 ,所以,我们无需再对最后剩余的栈中元素的结果值进行赋 0 。

  • 下面演示一下过程:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

public int[] dailyTemperatures(int[] T) {
    
    
    Stack<Integer> stack = new Stack<>();
    int[] res = new int[T.length];

    for(int i = 0; i < T.length; i++){
    
    
        while (!stack.isEmpty() && T[i] > T[stack.peek()]){
    
    
            Integer Idx = stack.pop();
            res[Idx] = i - Idx;
        }
        //如果栈为空 则添加元素,相等也得push
        stack.push(i);
    }
    return res;
}

执行结果:

执行结果

猜你喜欢

转载自blog.csdn.net/Vigor377/article/details/114406589