739. 每日温度
根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
思路
方法一: 直接求解, 利用字典提高性能
- 逆向遍历气温列表
- 对每个气温, 遍历字典, 找出温度更高并且距离最近的索引
- 因为只有[30,100]区间的整数气温, 使用字典将所有气温离当前最近的索引记录下来, 遍历会比较快
- 时间复杂度为: O(k*n), 其中k为气温区间的整数数量, n为列表长度
方法二: 栈
- 逆向遍历气温表
- 用栈记录气温的索引
- 对每个气温, 对比当前气温和栈顶气温
- 如果当前气温>栈顶气温, 且栈不为空, 则弹出栈顶元素
- 直到当前气温<栈顶气温, 停止栈, 然后记录当前气温与最近的更高气温的索引差值
# 方法一
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
len_T = len(T)
if len_T == 0: return []
tmp_dic={} # 温度字典, 用于存储所有温度最近的index
lst=[0] * len_T # 用于记录最终结果的列表
# 遍历T列表
for i in range(len_T-1, -1, -1):
# 在字典中找到比当前温度高, 且索引距离最近的气温索引,记录到列表中
for tmp in dic:
if tmp>T[i]:
if lst[i] == 0 or lst[i] > dic[j]-i:
lst[i] = dic[j]-i
# 把当天的温度记录到字典中
dic[T[i]] = i
return lst
# 方法二: 栈
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
ans = [0] * len(T)
stack = []
for i in range(len(T)-1, -1, -1):
while stack and T[i] >= T[stack[-1]]:
stack.pop()
if stack:
ans[i] = stack[-1] - i
stack.append(i)
return ans