564 字
3 分钟
每日温度
.png)
题目描述
给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0
来代替。
解题思路
- 单调栈策略:
- 使用栈存储尚未找到更高温度的日期索引
- 维护栈内温度值单调递减的特性
- 温度比较机制:
- 遍历每日温度,与栈顶温度比较
- 若当前温度更高,则计算日期差并更新答案
- 索引存储优化:
- 栈中存储日期索引而非温度值
- 通过索引访问温度和设置结果
- 结果初始化:
- 默认所有结果值为0(无更高温度)
- 仅更新找到更高温度的日期
关键洞察
- 单调性利用:
- 栈内温度保持递减顺序
- 确保栈顶总是最近待解决的日期
- 跳跃性更新:
- 弹出栈顶元素时可连续更新多个日期
- 避免重复遍历相同区间
- 时空平衡:
- 牺牲O(n)空间获得O(n)时间复杂度
- 显著优于暴力解法的O(n²)
- 边界处理:
- 栈空时无需操作
- 遍历结束栈中剩余日期保持0
复杂度分析
指标 | 说明 |
---|---|
时间复杂度 | O(n):每个日期最多入栈出栈一次 |
空间复杂度 | O(n):栈的空间开销(最坏情况存储n个索引) |
代码实现
/** * @param {number[]} temperatures * @return {number[]} */var dailyTemperatures = function (temperatures) { const n = temperatures.length; const result = new Array(n).fill(0); const stack = [ { index: 0, t: temperatures[0] } ]
for (let i = 1; i < n; i++) { const t = temperatures[i]; while (stack.length!==0 && stack[stack.length - 1].t < t) { const { index } = stack.pop(); result[index] = i - index; } stack.push({ index: i, t }) }
return result;};
实际应用场景
- 农业预测:预测农作物成熟所需的积温天数`
- 能源管理:电力公司预测空调负荷高峰等待天数`
- 旅游规划:推荐最佳旅游目的地等待温暖天气的天数`
- 冷链物流:计算冷链货物在安全温度外的暴露风险`