本题来自leetcode 第 739 题。
本题题目
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
解题思路
本题可以通过循环嵌套暴力解决,也可以通过单调栈更好的解决。
代码展示
方法一:暴力解法
var dailyTemperatures = function(T) {
const len = T.length;
const res = [];
let r = null, j = 0;
for(let i = 0; i < len; i++, j = i + 1) {
if (i === len - 1) {
res.push(0);
break;
}
while(T[j] <= T[i] && j < len) {
if (j === len - 1) {
res.push(0);
}
j++;
}
if (T[j] > T[i]) {
res.push(j - i);
}
}
return res;
};
var dailyTemperatures = function(T) {
const len = T.length;
const res = [];
const stack = [];
let l = 0, r = 0;
for(let i = 0; i < len; i++) {
let current = T[i];
for(let j = i + 1; j < len; j++) {
if(current < T[j]) {
res[i] = j - i;
break;
}
if(j === len - 1) {
res.push(0);
}
}
if (i === len - 1) {
res.push(0);
}
}
return res;
};
上边通过循环嵌套的方式,时间复杂度O(mn),空间复杂度O(m),所以需要改进一下。
方法二:单调栈
var dailyTemperatures = function(T) {
const len = T.length;
const stack = [];
const res = new Array(len).fill(0);
for(let i = 0; i < len; i++) {
while(stack.length && T[i] > T[stack[stack.length - 1]]) {
const index = stack.pop();
res[index] = i - index;
}
// 因为数组的每一项是索引的差,所以可以将索引存下来
stack.push(i);
}
return res;
}
此方法时间复杂度为O(n),空间复杂度为O(n)
总结
通过管理栈,只需要一次循环就可以计算出最终结果,所以方法二是比较好的。