🌡️ LeetCode 739:每日温度(详解 + 单调栈 + 多种思路对比)
📌 题目描述
给定一个整数数组
temperatures
,表示每天的温度,返回一个数组answer
,其中answer[i]
是指在第i
天之后,才会有更高温度的天数。如果之后没有更高的温度,answer[i] = 0
。
🔍 示例:
输入:temperatures = [73,74,75,71,69,72,76,73]
输出:[1,1,4,2,1,1,0,0]
💡 解题思路
这是一道经典的 单调栈应用题,本质是要寻找「下一个更大的元素」,具体分析如下:
✅ 方法一:单调递减栈(推荐,最优解法)
- 栈中存的是 索引(index),栈顶元素对应的温度总是 比当前元素大或相等;
- 遍历过程中,一旦遇到比栈顶索引所指温度高的当前值,就开始出栈,并计算天数差值;
- 最终形成一个从左到右的高温等待天数列表。
🔄 模拟过程(以 [73,74,75,71,69,72,76,73]
为例):
- 遇到
74 > 73
,计算1
天; - 遇到
75 > 74
,计算1
天; - 后面直到遇到
76 > 72
,再更新; - 这样一步步更新每个位置等到更高温度的天数。
💻 Go 实现代码
func dailyTemperatures(temperatures []int) []int {n := len(temperatures)answer := make([]int, n)stack := []int{} // 存索引for i := 0; i < n; i++ {for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack)-1]] {idx := stack[len(stack)-1]stack = stack[:len(stack)-1]answer[idx] = i - idx}stack = append(stack, i)}return answer
}
⏱️ 复杂度分析
项目 | 复杂度 |
---|---|
时间复杂度 | $O(n)$ (每个元素最多被入栈出栈一次) |
空间复杂度 | $O(n)$ (栈和输出数组占用空间) |
🔄 方法二:暴力双重循环(超时 or 不推荐)
- 对于每一个位置,向后扫描直到找到更高温度;
- 时间复杂度为 $O(n^2)$,无法通过大规模数据。
✅ 总结
解法 | 时间复杂度 | 空间复杂度 | 是否推荐 |
---|---|---|---|
单调栈 | $O(n)$ | $O(n)$ | ✅✅✅ 强烈推荐 |
暴力解法 | $O(n^2)$ | $O(1)$ | ❌ |
🧠 思维拓展
-
单调栈结构可用于「下一个更大元素」「区间最大值」等问题;
-
同类题目推荐:
- 496. 下一个更大元素 I
- 503. 下一个更大元素 II
- 84. 柱状图中最大的矩形
💡 如果你觉得这篇文章对你有帮助,欢迎 点赞 👍 收藏 ⭐ 关注 🧡,后续我会继续更新 LeetCode 高质量题解!