1. 问题描述:
请根据每日气温列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 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 <= 10 ^ 5
30 <= temperatures[i] <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/daily-temperatures
2. 思路分析:
分析题目可以知道我们需要找到每一个元素右边第一个比自己大的元素,根据这个特点我们可以知道可以使用单调栈的模板解决(单调栈的裸题),单调栈适合于求解左边/右边第一个比自己大/小的元素的位置的问题,默写一下单调栈的模板即可。
3. 代码如下:
from typing import List
class Solution:
# 单调栈模板题
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
# 因为找的是右边所以是顺序遍历, 因为这样弹出元素的时候可以更新左边的元素
n = len(temperatures)
res = [0] * n
# 辅助栈用来存储中间结果
stack = list()
for i in range(n):
x = temperatures[i]
while stack and x > temperatures[stack[-1]]:
k = stack.pop()
# 计算两个元素的位置之差
res[k] = i - k
stack.append(i)
return res