暴力解法(超时)
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
n = len(T)
res = []
# 逐个遍历
for i in range(n-1):
for j in range(i+1, n):
if T[i] < T[j]:
res.append(j-i)
break
else:
res.append(0)
res.append(0)
return res
单调栈
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
stack, output = [], []
# 倒序遍历温度列表
# 遍历倒数第一个元素的时候, stack为空, 不会走while循环
for i, t in enumerate(T[::-1]):
# 如果栈不为空
while stack:
# 比较当前元素与上一个元素
prev_i, prev_t = stack[-1]
# 如果当前温度小于上一个温度
if t < prev_t:
# 更新输出结果
output.append(i-prev_i)
# 当前温度入栈
stack.append((i, t))
# 退出循环
break
else:
# 如果当前温度不小于上一个温度
# 弹出上一个温度
stack.pop()
# 栈为空时, 输出结果0
# 同时把当前元素入栈
if not stack:
output.append(0)
stack.append((i, t))
# 由于前面是倒序遍历, 最后的结果需要反转
return output[::-1]
优化版
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
n, stack = len(T), []
res = [0] * n
# 倒序遍历
for i in range(n-1, -1, -1):
# 如果栈不为空, 且栈顶元素不大于当前元素
while stack and T[stack[-1]] <= T[i]:
# 弹出栈顶元素
stack.pop()
# 如果栈为空, 说明从当前元素往后没有大于当前元素的
# 栈不空的话, 说明栈顶元素就是大于当前元素且离得最近的
res[i] = stack[-1] - i if stack else 0
# 入栈当前元素
stack.append(i)
return res