【算法】每日温度

172 阅读1分钟

难度:中等

题目:

给定一个整数数组 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]

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100

解题思路:

这个问题可以通过使用一个单调栈(通常是单调递减栈)来解决。单调栈是一种特殊的数据结构,它保持栈内的元素按照某种顺序排列,例如单调递增或单调递减。在这个问题中,我们将使用一个单调递减栈,这样我们可以快速找到比当前温度更高的下一个温度。

  1. 初始化一个空的栈和一个输出数组 answer,其长度与输入数组 temperatures 相同,所有元素初始化为 0。
  2. 遍历 temperatures 数组中的每一个温度。
  3. 对于每一个遍历到的温度,比较栈顶元素对应的温度。
  • 如果栈顶元素的温度小于当前温度,则说明找到了一个更高的温度。

  • 计算栈顶元素距离当前元素的天数差,并更新 answer 数组中对应的位置。

  • 弹出栈顶元素,继续比较新的栈顶元素,直到栈为空或者栈顶元素的温度不小于当前温度。

  • 如果栈顶元素的温度大于等于当前温度,将当前的索引压入栈中。

  1. 继续遍历直到所有元素都被处理完毕。

JavaScript 实现:

/**
 * @param {number[]} temperatures
 * @return {number[]}
 */
var dailyTemperatures = function(temperatures) {
    const answer = new Array(temperatures.length).fill(0);
    const stack = []; // 单调递减栈,存储索引

    for (let i = 0; i < temperatures.length; i++) {
        while (stack.length > 0 && temperatures[i] > temperatures[stack[stack.length - 1]]) {
            const idx = stack.pop();
            answer[idx] = i - idx;
        }
        stack.push(i);
    }

    return answer;
};