72.每日温度(学习)
给定一个整数数组 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.n是温度数组的长度。
2.result是一个新数组,用于存储结果,即对于每一天,下一个更高温度出现在几天后。初始时,假设没有更高的温度,所以所有元素都是0。
3.stack是一个单调递减栈,用于存储temperatures数组的索引,而不是温度值本身。
二、遍历温度数组
1.使用for循环遍历temperatures数组中的每一个元素(及其索引i)。
2.处理栈和计算天数
2.1.在循环内部,我们检查栈是否不为空,并且当前温度temperatures[i]是否大于栈顶索引对应的温度temperatures[stack[stack.length - 1]]。
2.2.如果栈不为空且当前温度大于栈顶温度,那么说明我们找到了栈顶索引对应的温度之后第一个更高的温度,即temperatures[i]。
2.3.我们弹出栈顶索引index,并计算天数差i - index,这表示从index天到当前天i之间,下一个更高温度出现在多少天后。
2.4.将这个天数存储在结果数组result的index位置。
3.将当前索引压入栈中
3.1.无论是否找到了更高的温度,我们都将当前索引i压入栈中,以便后续可能的比较。
三、返回结果
1.当遍历完整个temperatures数组后,result数组就包含了所有天数的结果。函数返回这个数组。
var dailyTemperatures = function (temperatures) {
const n = temperatures.length;
const result = new Array(n).fill(0); // 初始化结果数组,全部填充为0
const stack = []; // 单调递减栈,存储索引
for (let i = 0; i < n; i++) {
// 当栈不为空且当前温度大于栈顶索引对应的温度时
while (stack.length > 0 && temperatures[i] > temperatures[stack[stack.length - 1]]) {
const index = stack.pop(); // 弹出栈顶索引
result[index] = i - index; // 计算并设置结果
}
stack.push(i); // 将当前索引压入栈中
}
return result;
};