题目:
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
单调栈
对于这道题目可以这么理解:
- 先将暂时找不到更高温度的元素存起来。后续遇到新的元素,只需要和这些元素组中的元素进行比较。根据先后次序,存储元素的后续更高温度一定是当前元素。
- 为了使当前元素能够更快和元素组中的元素进行比较,可以考虑将元素组中暂时没有答案的元素有序排列。当前元素依次从最小元素比较,遇到相同的就退出,然后把自己加进去。新形成的元素组也是有序的。
- 这样子的数据结构注意到就是一个栈的结构。这样依次进行步骤,就可以得到解答。这就是单调栈。
具体步骤:
对于元素temperatures[i]
- 如果栈为空,直接将
i入栈。 - 如果栈不为空,比较栈顶元素
temperatures[stack.getLast()]和temperatures[i]的大小:- 如果
temperatures[i] <= temperatures[stack.getLast()],则将i入栈。 - 如果
temperatures[i] > temperatures[stack.getLast()],则说明找到了栈顶元素的下一个更高温度。弹出栈顶元素,并计算天数差,将结果存入答案数组中。重复此过程,直到栈为空或栈顶元素大于等于当前温度。
- 如果
- 将当前索引
i入栈,继续处理下一个温度。