代码与动画 MONOTONIC STACK
单调栈.
保存尚未等到更高温度的日期,遇到更高温度时回填等待天数。
时间 O(n)空间 O(n)每日温度
原理与执行逻辑
栈保存尚未找到后续更高温度的日期下标。新温度高于栈顶时,当前日期就是栈顶日期首次遇到更高温度的位置,可以弹出并回填等待天数。
执行步骤
- 将答案初始化为 0,准备空栈。
- 读取当前温度,与栈顶下标对应的温度比较。
- 当前温度更高时持续弹栈,将答案写为当前下标减去弹出下标。
- 将当前下标入栈,扫描结束后保留未解决日期的答案 0。
关键理解
栈内下标递增、对应温度非递增。每个日期入栈一次、至多出栈一次,因此总操作数为线性量级;相等温度不能解决等待。
简短示例
[73, 71, 74] 中第 2 天到来时,先解决 71 的等待 1 天,再解决 73 的等待 2 天,答案为 [2, 1, 0]。
代码与执行动画
STEP 0 / 23function dailyTemperatures(a) { const stack = [], answer = Array(a.length).fill(0); for (let i = 0; i < a.length; i++) { while (stack.length && a[i] > a[stack.at(-1)]) { const previous = stack.pop(); answer[previous] = i - previous; } stack.push(i); } return answer;}当前数据正在操作已访问 / 命中标记 / 指针
0
初始化等待栈
上行是温度,中行是栈(下标:温度),下行是等待天数。
配置演示数据
应用后重新生成执行过程,可单步观察结果。
单调栈的操作规则
栈保存下标,对应温度从栈底到栈顶非递增。每个下标入栈、出栈至多一次;没有更高温度的日期保留 0。
对应题目与扩展练习
观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。
- 对应题目739. 每日温度打开题目
直接对应递减栈、出栈时回填等待天数。