739. 每日温度

题目描述

给定一个整数数组 temperatures ,表示每天的温度,

返回一个数组 answer

其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。

如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]

输出: [1,1,4,2,1,1,0,0]

示例 2:

输入: temperatures = [30,40,50,60]

输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90]

输出: [1,1,0]

leet code 739. 每日温度_出栈

题目解析

  • 可以维护一个栈
  • 栈里面存储的当前所遇到的最大元素所对应的下标,方便计算天数
  • 以数组[73,74,75,71,69,72,76,73]为例
  • i = 0,ele = 73,入栈--> {0},结果集 = [0, 0, 0, 0, 0, 0, 0, 0]
  • i = 1,ele = 74,大于栈顶元素,弹出,入栈 --> {1}
  • 结果集 = [1 - 0, 0, 0, 0, 0, 0, 0, 0]
  • i = 2,ele = 75;同理
  • 栈 = {2}
  • 结果集 = [1, 1, 0, 0, 0, 0, 0, 0]
  • i = 3,ele = 71;
  • 栈 = {2, 3}
  • 结果集 = [1, 1, 0, 0, 0, 0, 0, 0]
  • i = 4,ele = 69
  • 栈 = {2, 3, 4} --> 75 > 71 > 69
  • 结果集 = [1, 1, 0, 0, 0, 0, 0, 0]
  • i = 5,ele = 72 小于72的元素出栈
  • 栈 = {2, 5}
  • 结果集 = [1, 1, 0, 5 - 3, 5 - 4, 0, 0, 0]
  • i = 6,ele = 76小于76的元素出栈
  • 栈 = {6}
  • 结果集 = [1, 1, 6 - 2, 5 - 3, 5 - 4, 6 - 5, 0, 0]
  • i = 7,ele = 73没有小于73的元素
  • 栈 = {6, 7}
  • 结果集 = [1, 1, 6 - 2, 5 - 3, 5 - 4, 6 - 5, 0, 0]
  • 结果集 = [1,1,4,2,1,1,0,0]

show code

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        // 创建对应的结果集
        int[] ans = new int[n];
        // 创建一个栈保存对应的 索引
        Deque<Integer> stack = new LinkedList<>();
        for(int i = 0;i < n;i++) {
            int temperature = temperatures[i];
            while(!stack.isEmpty() && temperatures[stack.peek()] < temperature) {
                int popIdx  = stack.pop();
                ans[popIdx] = i - popIdx;
            }
            stack.push(i);
        }
        return ans;
    }
}