说在前面
🎈每天进行一道算法题目练习,今天的题目是“每日温度”,今天的题目是一道比较简单的单调栈应用题,未接触过单调栈或者刚接触单调栈的同学可以尝试着使用单调栈来优化自己的代码。
问题描述
给定一个整数数组 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 <= 10^5
30 <= temperatures[i] <= 100
思路分析
我们结合实例一来理解一下题意,如上图,我们需要找出每一天之后温度比当天高的第一个天数,计算两个天数之差,如:
- 第一天的温度为73度,下一个温度比它高的天数为第二天的74度,所以第一天的答案应该是1,即明天的温度会比当天的温度高。
- 第二天的温度为74度,下一个温度比它高的天数为第三天的75度,所以第二天的答案应该是1,即明天的温度会比当天的温度高。
- 第三天的温度为75度,下一个温度比它高的天数为第七天的76度,所以第三天的答案应该是4(7-3),即四天后的温度会比当天的温度高。
.
.
.
- 第七天的温度为76度,后面没有温度比它更高的天数了,所以第七天的答案应该是0。
- 第八天的温度为73度,后面没有温度比它更高的天数了,所以第八天的答案应该是0。
我们可以使用一个栈来保存当前未找到答案的天数,遍历一次温度数组,判断栈顶天数的温度是否比当前温度小,如果是的话就更新栈顶天数的答案,并将栈顶元素出栈,我们不难发现,维护的这个栈是一个单调递减的栈(因为只有比栈顶元素小的数才会入栈),通过这个单调栈我们并可以更加快速的得出答案,具体 步骤如下:
- 1、定义一个栈及答案数组
定义个个空数组作为栈,定义一个大小与temperatures一样的数组来保存答案,并初始化为0。
let stack = [];
let res = new Array(temperatures.length).fill(0);
- 2、维护单调栈的单调性
当栈顶天数温度小于当前天数的温度时,我们应该要将栈顶天数出栈,维持栈的单调递减性。
while(stack && temperatures[i] > temperatures[stack[stack.length - 1]]){
const ind = stack.pop();
res[ind] = i - ind;
}
- 3、将当天天数入栈
第2步已经维持了栈的单调性,可以直接将当天的天数入栈。
stack.push(i);
AC代码
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function(temperatures) {
let stack = [];
let res = new Array(temperatures.length).fill(0);
for(let i = 0; i < temperatures.length; i++){
while(stack && temperatures[i] > temperatures[stack[stack.length - 1]]){
const ind = stack.pop();
res[ind] = i - ind;
}
stack.push(i);
}
return res;
};
说在后面
🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。