leetcode刷题(45)——739.每日温度

一、题目

根据每日气温列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

二、思路及代码

思路一:

对每个温度值向后进行搜索 ,找到比当前温度更高的值,它们之间的索引差就是要等待的天数。

class Solution {
    public int[] dailyTemperatures(int[] T) {
        int[] result = new int[T.length];
        for(int i = 0; i < T.length; i++){
            for(int j = i + 1; j < T.length; j++){
                if(T[j] > T[i]){
                    result[i] = j - i;
                    break;
                }
            }
        }
        return result;
    }
}

思路二:单调栈

单调栈知识可以参考Java数据结构与算法——单调栈算法笔记

我们要求的是需要再等待多久温度才会升高超过该日的天数,也就是要找到每一天右边第一个高于当天温度的那一天。所以我们想到了单调递增栈,因为单调递增栈能够找到栈顶元素右边第一个大于该栈顶元素的元素。

我们是将索引存储在栈内,索引代表的温度严格递增。对于当前要入栈的元素 e,如果 e 小于栈顶元素,则 e 直接入栈;如果 e 大于或等于栈顶元素,这时弹出栈顶元素之后 e 才能入栈,说明 e 是栈顶元素右边第一个大于该栈顶元素的元素,栈顶索引和当前温度的索引差就是需要等待的天数。

举例分析:

注:栈内实际存储的是温度的索引,为了方便查看,把温度值也写出来,标注在括号中,如 0(73)。

给定温度列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],数组 res[] 记录结果。操作过程如下:

  • i = 0,0(73) 入栈,得
    |0(73)|
  • i = 1,74 > 73,res[0] = 1 - 0 = 1,0(73) 出栈,1(74) 入栈,得
    |1(74)|
  • i = 2,75 > 74,res[1] = 2 - 1 = 1,1(74) 出栈,2(75) 入栈,得
    |2(75)|
  • i = 3,71 < 75,3(71) 入栈,得
    |3(71)|
    |2(75)|
  • i = 4,69 < 71,4(69) 入栈,得
    |4(69)|
    |3(71)|
    |2(75)|
  • i = 5,72 > 69,res[4] = 5 - 4 = 1,4(69) 出栈;72 > 71,res[3] = 5 - 3 = 2,3(71) 出栈;72 < 75,5(72) 入栈,得
    |5(72)|
    |2(75)|
  • i = 6,76 > 72,res[5] = 6 - 5 = 1,5(72) 出栈;76 > 75,res[2] = 6 - 2 = 4,2(75) 出栈,6(76) 入栈,得
    |6(76)|
  • i = 7,73 < 76,7(73) 入栈,得
    |7(73)|
    |6(76)|
  • 此时,数组遍历完毕且没有比栈内索引对应温度更高的温度了,所以 res[6] = res[7] = 0。

最后的结果:res[] = {1,1,4,2,1,1,0,0}。

参考代码:

class Solution {
    public int[] dailyTemperatures(int[] T) {
        int[] res = new int[T.length];
        LinkedList<Integer> stack = new LinkedList<>();
        for(int i = 0; i < T.length; i++){
            while(!stack.isEmpty() && T[i] > T[stack.peek()]){
                int cur = stack.pop();
                res[cur] = i - cur;// 索引差就是等待的天数
            }
            stack.push(i);
        }
        return res;
    }
}

你可能感兴趣的:(leetcode刷题)