题目链接:739. 每日温度
题目描述
给定一个整数数组 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
文章讲解:代码随想录
视频讲解:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度_哔哩哔哩_bilibili
题解1:暴力法(超时)
思路:两层 for 循环暴力查找下一个更高的温度在几天后。
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function(temperatures) {
const res = [];
for(let i = 0; i < temperatures.length; i++) {
let temp = 0;
for (let j = i + 1; j < temperatures.length; j++) {
if (temperatures[j] > temperatures[i]) {
temp = j - i;
break;
}
}
res.push(temp);
}
return res;
};
分析:时间复杂度为 O(n²),空间复杂度为 O(1)。提交后超出时间限制,需要寻找时间复杂度更低的方法。
题解2:单调栈
思路:构建一个从栈底到栈顶元素单调递减的单调栈,遍历温度数组,将元素逐个加入到单调栈中,同时连续弹出栈顶元素保持单调性,在弹出元素时记录结果。
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function(temperatures) {
const res = [];
const stack = [];
for(let i = 0; i < temperatures.length; i++) {
while (stack.length > 0 && temperatures[stack[stack.length - 1]] < temperatures[i]) {
const index = stack.pop();
res[index] = i - index;
}
stack.push(i);
}
while (stack.length > 0) {
res[stack.pop()] = 0;
}
return res;
};
分析:时间复杂度为 O(n),空间复杂度为 O(n)。
收获
理解了单调栈解题的思路,有时候我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(单调栈)来记录我们遍历过的元素。