题目
给定每日温度数组,返回每一天还要等多少天才能遇到更高温度。如果之后都不会升高,就返回 0。
题目分析
这题和“下一个更大元素”本质很像,只是这次要求的不是更大值本身,而是与当前位置之间的距离。
所以单调栈仍然适用,而且栈里必须存下标。
方法一:直觉解法
最直接的办法是对每一天向右找第一个更高温度,复杂度是 O(n^2)。
方法二:优化思路
维护一个单调递减栈:
- 栈里存还没找到更高温度的下标
- 当前温度如果更高,就不断弹出栈顶
- 弹出时顺便计算距离
i - top
Go 实现
1func dailyTemperatures(temperatures []int) []int {
2 ans := make([]int, len(temperatures))
3 stack := make([]int, 0, len(temperatures))
4
5 for i, temp := range temperatures {
6 for len(stack) > 0 && temperatures[stack[len(stack)-1]] < temp {
7 top := stack[len(stack)-1]
8 stack = stack[:len(stack)-1]
9 ans[top] = i - top
10 }
11 stack = append(stack, i)
12 }
13
14 return ans
15}
复杂度分析
- 时间复杂度:
O(n) - 空间复杂度:
O(n)
易错点
- 栈里必须存下标,不然没法回填距离
- 未被弹出的元素答案默认就是
0
我的复盘
这题让我真正吃透了单调栈的“延迟结算”思路:答案不是立刻得出,而是在未来某个更强信号出现时一次性结算。