739. 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 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]
算法思路
该代码通过 单调栈 解决每日温度问题,核心思想是维护一个存储未找到更高温度日期的索引栈,栈内元素对应的温度始终保持单调递减。通过比较当前温度与栈顶温度,快速确定下一个更高温度的等待天数。具体步骤如下:
算法步骤
-
初始化数据结构:
stack:存储尚未找到更高温度的日期索引(栈中温度单调递减)。res:结果数组,初始化为全0。
-
遍历温度数组:
- 当前温度高于栈顶温度:
循环弹出栈顶索引pre,计算等待天数i - pre,更新res[pre]。 - 当前温度入栈:将当前索引
i压入栈。
- 当前温度高于栈顶温度:
-
终止条件:遍历结束后,栈中剩余元素的等待天数保持
0(默认值)。
切入点
- 单调栈特性:栈中元素对应的温度保持递减,确保每个元素只需处理一次。
- 延迟计算:遇到更高温度时才更新历史日期的等待天数,避免重复比较。
关键点
- 栈的单调性维护:
每次处理当前温度时,弹出所有比当前温度低的栈顶元素,保证栈内温度严格递减。 - 结果更新时机:
仅在发现更高温度时更新结果数组,避免无效遍历。 - 索引存储优化:
栈中存储索引而非温度值,便于直接计算天数差。
复杂度分析
| 维度 | 分析 |
|---|---|
| 时间复杂度 | O(n):每个元素最多入栈、出栈一次,总操作次数为 2n。 |
| 空间复杂度 | O(n):最坏情况下栈存储所有元素(如温度严格递减)。 |
算法代码
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack = [] # 单调递减栈,存储未找到更高温度的日期索引
n = len(temperatures)
res = [0] * n # 初始化结果数组
for i in range(n):
# 当栈顶温度 < 当前温度时,循环更新结果
while stack and temperatures[stack[-1]] < temperatures[i]:
pre = stack.pop()
res[pre] = i - pre # 计算等待天数
stack.append(i) # 当前索引入栈
return res

1642

被折叠的 条评论
为什么被折叠?



