每日刷题第14天 2021.1.9
每日温度
- 难度:中等
- 方法:单调栈
题目
- 请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
输入: temperatures = [30,60,90]
输出: [1,1,0]
提示
1 <= temperatures.length <= 10530 <= temperatures[i] <= 100
解法
- 暴力模拟:双循环
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function(temperatures) {
// 暴力模拟下
let lenT = temperatures.length;
let ans = new Array(lenT).fill(0);
// console.log(ans,'ans');
// 记录长度
let len = 0;
for (let i = 0; i < temperatures.length; i++) {
len = 0;
for (let j = i + 1; j < temperatures.length; j++) {
if (temperatures[j] > temperatures[i]) {
// 如果大于,记录结果存储
len = j - i;
ans[i] = len;
break;
}
}
}
return ans;
};
- 单调栈方法
- 判断栈是否为空,为空则压入当前数值的下标(索引值)
- 栈不为空,比较当前值与栈顶元素的大小。
- 大于则弹出栈顶元素并记录当前的间距(while循环)
- 小于,直接压入栈中即可。
// 方法:单调栈
let stack = [];
// 结果存储数组
let lenT = temperatures.length;
let ans = new Array(lenT).fill(0);
for (let i = 0; i < temperatures.length; i++) {
// 如果栈空,就压入数值
if (stack.length == 0) {
// 记录下标就可以
stack.push(i);
}else {
// 栈非空,比较大小
// 大:弹出,计算长度
while (temperatures[i] > temperatures[stack[stack.length - 1]]) {
// 记录长度
ans[stack[stack.length - 1]] = i - stack[stack.length - 1];
// 一直弹出
stack.pop();
}
// 小:直接压入
stack.push(i);
}
}
return ans;
};
附录
- 单调栈的理解与使用,栈顶元素、栈底元素。