题目
根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
思路
1.暴力解法
超时,时间复杂度O(n^2),空间复杂度O(n)
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
ans = []
for i in range(len(T)-1):
find = False
for j in range(i+1, len(T)):
if T[i] < T[j]:
ans.append(j-i)
find = True
break
if not find:
ans.append(0)
ans.append(0)
return ans
2.栈
击败95% 时间复杂度O(n),空间复杂度O(n)
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
stack = [] //定义栈
ans = [0]*len(T) //定义一个长度为len(T)的列表,用于记录对应位置的所需天数
for i in range(len(T)):
if stack == []: //栈为空,直接将当前索引入栈,跳过循环
stack.append(i)
continue
while stack and T[stack[-1]] < T[i]: //当栈不为空,且栈顶温度小于当前温度
date = stack.pop(-1) //代表栈顶保存的索引已经找到了离它最近的温度大于它的位置
ans[date] = i -date // 计算出所需天数
stack.append(i) // 将当前索引入栈
return ans