564 字
3 分钟
每日温度

题目描述#

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

解题思路#

  1. 单调栈策略
    • 使用栈存储尚未找到更高温度的日期索引
    • 维护栈内温度值单调递减的特性
  2. 温度比较机制
    • 遍历每日温度,与栈顶温度比较
    • 若当前温度更高,则计算日期差并更新答案
  3. 索引存储优化
    • 栈中存储日期索引而非温度值
    • 通过索引访问温度和设置结果
  4. 结果初始化
    • 默认所有结果值为0(无更高温度)
    • 仅更新找到更高温度的日期

关键洞察#

  1. 单调性利用
    • 栈内温度保持递减顺序
    • 确保栈顶总是最近待解决的日期
  2. 跳跃性更新
    • 弹出栈顶元素时可连续更新多个日期
    • 避免重复遍历相同区间
  3. 时空平衡
    • 牺牲O(n)空间获得O(n)时间复杂度
    • 显著优于暴力解法的O(n²)
  4. 边界处理
    • 栈空时无需操作
    • 遍历结束栈中剩余日期保持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;
};

实际应用场景#

  1. 农业预测:预测农作物成熟所需的积温天数`
  2. 能源管理:电力公司预测空调负荷高峰等待天数`
  3. 旅游规划:推荐最佳旅游目的地等待温暖天气的天数`
  4. 冷链物流:计算冷链货物在安全温度外的暴露风险`

相似题目#

每日温度
https://website-truelovings-projects.vercel.app/posts/algorithms/每日温度/
作者
欢迎来到StarSky的网站!
发布于
2025-08-22
许可协议
CC BY-NC-SA 4.0