Given a list of daily temperatures T, return a list such that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.
For example, given the list of temperatures T = [73, 74, 75, 71, 69, 72, 76, 73], your output should be [1, 1, 4, 2, 1, 1, 0, 0].
Note: The length of temperatures will be in the range [1, 30000]. Each temperature will be an integer in the range [30, 100].
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
这道题目最 “难” 的一个点是题目的理解。
给定列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],为啥输出就是 [1, 1, 4, 2, 1, 1, 0, 0] ?
下面来一个个进行解释。
对于输入 73,它需要 经过一天 才能等到温度的升高,也就是在第二天的时候,温度升高到 74 ,所以对应的结果是 1。
对于输入 74,它需要 经过一天 才能等到温度的升高,也就是在第三天的时候,温度升高到 75 ,所以对应的结果是 1。
对于输入 75,它经过 1 天后发现温度是 71,没有超过它,继续等,一直 等了四天,在第七天才等到温度的升高,温度升高到 76 ,所以对应的结果是 4 。
对于输入 71,它经过 1 天后发现温度是 69,没有超过它,继续等,一直 等了两天,在第六天才等到温度的升高,温度升高到 72 ,所以对应的结果是 2 。
对于输入 69,它 经过一天 后发现温度是 72,已经超过它,所以对应的结果是 1 。
对于输入 72,它 经过一天 后发现温度是 76,已经超过它,所以对应的结果是 1 。
对于输入 76,后续 没有温度 可以超过它,所以对应的结果是 0 。
对于输入 73,后续 没有温度 可以超过它,所以对应的结果是 0 。
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
l = len(T)
stack = [] #这里定义一个栈就不用说了
res = [0] * l # 这里是最后要返回的result,因为题目中说没有匹配的就返回0,
# 所以这里初始化一个全是0的list,然后把那些有匹配的替换掉即可。
for idx, t in enumerate(T): # 下面是关键
while stack and t > T[stack[-1]]: # 当stack为空时,运行stack.append(idx),则stack=[0]
# 然后仅当遍历元素 t 小于stack顶端的值时append进去,
# 这会导致stack中idx代表的元素是单调递减的,
# 如果此时遍历到一个 t,大于stack顶端的值,那这个t就是离stack
# 顶端值最近的那个大值。
res[stack.pop()] = idx-stack[-1] # 然后pop出来,还是要注意stack.pop出来的是idx,这样res这
# 一串0里对应位置的0就会被替换成应有的值。
# 再进入while循环判断t和stack.pop后的新的顶端值哪个大。
# 如此反复。
stack.append(idx)
return res