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]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
解法
方法一:单调栈
单调栈常见模型:找出每个数左/右边离它最近的且比它大/小的数。模板:
stk = []
for i in range(n):
while stk and check(stk[-1], i):
stk.pop()
stk.append(i)
对于本题,我们需要找出每个数右边离它最近的且比它大的数,因此我们可以从右往左遍历数组,且需要维护一个从栈底到栈顶单调递减的栈。
对于当前遍历到的数 temperatures[i]
,如果栈顶元素 temperatures[stk[-1]]
小于等于 temperatures[i]
,则弹出栈顶元素,直到栈为空或者栈顶元素大于 temperatures[i]
。如果此时栈不为空,那么栈顶元素就是 temperatures[i]
右边离它最近的且比它大的数,更新 ans[i] = stk[-1] - i
。接着,我们将 $i$ 入栈,继续遍历下一个数。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为 temperatures
数组的长度。
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
方法二
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|