

本题要求的是在 i 右边最近的 >=temp[i] 的数,这是单调栈的标准应用
单调栈
从右向左
js
/**
* @param {number[]} temperatures
* @return {number[]}
*/
// 从右向左看
var dailyTemperatures = function (temperatures) {
const stack = []
const n = temperatures.length
const ans = Array(n).fill(0)
for (let i = n - 1; i >= 0; i--) {
const x = temperatures[i]
while (stack.length > 0 && temperatures[stack[stack.length - 1]] <= x) {
// 当stack不为空,并且栈顶元素小于当前元素时,出栈小于当前元素的栈元素
stack.pop()
}
if (stack.length > 0) {
ans[i] = stack[stack.length - 1] - i
}
stack.push(i)
}
return ans
}从左向右
从左向右看,将未有答案的数组放到单调栈里,为什么用单调栈?这里我们将单调栈视为一个todolist,如果一个元素(比如5)大于栈顶的最小元素(3,i = 5时, monoStack = [4, 3]),那么3的答案就可以确定了,并且这个单调栈中所有比5小的元素的答案都可以确定了。只有比5大的元素,以及5不能确定。放在todolist里。
js
/**
* @param {number[]} temperatures
* @return {number[]}
*/
var dailyTemperatures = function (temperatures) {
const stack = [] // 单调栈 保存下标
const n = temperatures.length
const ans = new Array(n).fill(0)
for (let i = 0; i < n; i++) {
const t = temperatures[i]
while (stack.length && t > temperatures[stack[stack.length - 1]]) {
// stack.length 跳过第一次, js中空数组是true
const j = stack.pop()
ans[j] = i - j
}
stack.push(i)
}
return ans
}