难度:中等
题目:
给定一个整数数组 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 <= 10530 <= temperatures[i] <= 100
解题思路:
这个问题可以通过使用一个单调栈(通常是单调递减栈)来解决。单调栈是一种特殊的数据结构,它保持栈内的元素按照某种顺序排列,例如单调递增或单调递减。在这个问题中,我们将使用一个单调递减栈,这样我们可以快速找到比当前温度更高的下一个温度。
- 初始化一个空的栈和一个输出数组
answer,其长度与输入数组temperatures相同,所有元素初始化为 0。 - 遍历
temperatures数组中的每一个温度。 - 对于每一个遍历到的温度,比较栈顶元素对应的温度。
-
如果栈顶元素的温度小于当前温度,则说明找到了一个更高的温度。
-
计算栈顶元素距离当前元素的天数差,并更新
answer数组中对应的位置。 -
弹出栈顶元素,继续比较新的栈顶元素,直到栈为空或者栈顶元素的温度不小于当前温度。
-
如果栈顶元素的温度大于等于当前温度,将当前的索引压入栈中。
- 继续遍历直到所有元素都被处理完毕。
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;
};