🚩传送门:力扣题目

题目

给定一个整数数组 [LC]739. 每日温度 - 图1,表示每天的温度,返回一个数组 [LC]739. 每日温度 - 图2,其中 [LC]739. 每日温度 - 图3 是指在第 [LC]739. 每日温度 - 图4天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 [LC]739. 每日温度 - 图5 来代替。

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73] 输出: [1,1,4,2,1,1,0,0]

解题思路:单调栈

可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。
正向遍历温度列表。对于温度列表中的每个元素[LC]739. 每日温度 - 图6

  • 如果栈为空,则直接将 [LC]739. 每日温度 - 图7 进栈
  • 如果栈不为空,则比较栈顶元素 [LC]739. 每日温度 - 图8 对应的温度 [LC]739. 每日温度 - 图9和当前温度 [LC]739. 每日温度 - 图10
  1. 如果 [LC]739. 每日温度 - 图11,则直接将 [LC]739. 每日温度 - 图12 进栈。
  2. 否则将 [LC]739. 每日温度 - 图13 移除,并将 [LC]739. 每日温度 - 图14 对应的等待天数赋为 [LC]739. 每日温度 - 图15

流程:

  • [LC]739. 每日温度 - 图16 时,单调栈为空,因此将 [LC]739. 每日温度 - 图17 进栈。

    [LC]739. 每日温度 - 图18 [LC]739. 每日温度 - 图19

  • [LC]739. 每日温度 - 图20 时,由于 [LC]739. 每日温度 - 图21,因此移除栈顶元素 [LC]739. 每日温度 - 图22 ,赋值 [LC]739. 每日温度 - 图23,将 [LC]739. 每日温度 - 图24 进栈。

    [LC]739. 每日温度 - 图25 [LC]739. 每日温度 - 图26

  • [LC]739. 每日温度 - 图27 时,由于 [LC]739. 每日温度 - 图28,因此移除栈顶元素 [LC]739. 每日温度 - 图29 ,赋值 [LC]739. 每日温度 - 图30,将[LC]739. 每日温度 - 图31 进栈。

    [LC]739. 每日温度 - 图32 [LC]739. 每日温度 - 图33

  • [LC]739. 每日温度 - 图34 时,由于 [LC]739. 每日温度 - 图35,因此将[LC]739. 每日温度 - 图36 进栈。

    [LC]739. 每日温度 - 图37 [LC]739. 每日温度 - 图38

  • [LC]739. 每日温度 - 图39 时,由于 [LC]739. 每日温度 - 图40,因此将[LC]739. 每日温度 - 图41 进栈。

    [LC]739. 每日温度 - 图42 [LC]739. 每日温度 - 图43

  • [LC]739. 每日温度 - 图44 时,由于 [LC]739. 每日温度 - 图45,因此依次移除栈顶元素[LC]739. 每日温度 - 图46[LC]739. 每日温度 - 图47 ,赋值 [LC]739. 每日温度 - 图48,将[LC]739. 每日温度 - 图49 进栈。

    [LC]739. 每日温度 - 图50 [LC]739. 每日温度 - 图51

  • [LC]739. 每日温度 - 图52 时,由于 [LC]739. 每日温度 - 图53 ,因此依次移除栈顶元素[LC]739. 每日温度 - 图54[LC]739. 每日温度 - 图55 ,赋值[LC]739. 每日温度 - 图56 ,将[LC]739. 每日温度 - 图57 进栈。

    [LC]739. 每日温度 - 图58 [LC]739. 每日温度 - 图59

  • [LC]739. 每日温度 - 图60 时,由于[LC]739. 每日温度 - 图61,因此将[LC]739. 每日温度 - 图62 进栈。

    [LC]739. 每日温度 - 图63 [LC]739. 每日温度 - 图64

复杂度分析

时间复杂度:[LC]739. 每日温度 - 图65,其中 [LC]739. 每日温度 - 图66 是温度列表的长度。正向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。

空间复杂度:[LC]739. 每日温度 - 图67,其中 [LC]739. 每日温度 - 图68 是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。

我的代码

  1. class Solution {
  2. public int[] dailyTemperatures(int[] temperatures) {
  3. int length = temperatures.length;
  4. int[] ans = new int[length];
  5. LinkedList<Integer> stack = new LinkedList<Integer>();
  6. for (int i = 0; i < length; i++) {
  7. while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
  8. int top = stack.pop();
  9. ans[top] = i - top;
  10. }
  11. stack.push(i);
  12. }
  13. return ans;
  14. }
  15. }