Leetcode: 每日温度

39 阅读2分钟

原题:leetcode.cn/problems/da…

题目描述

给定一个整数数组 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. 冷链物流:计算冷链货物在安全温度外的暴露风险`

相似题目