1. 题目背景与核心需求
LeetCode 739题"每日温度"是一个经典的单调栈应用问题。给定一个每日温度列表,要求返回一个列表,表示需要等待多少天才能观测到更高温度。这个问题看似简单,但能很好地考察对数据结构的理解和应用能力。
在实际工作中,类似的场景其实很常见。比如在股票市场分析中,我们可能需要计算某支股票需要等待多少天后才会出现比当前更高的价格;在气象数据分析中,可能需要预测未来几天内温度上升的时间点。这类问题的核心都是要找到数组中每个元素后面第一个比它大的元素的位置。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与解法思路
2.1 暴力解法及其局限性
最直观的解法是使用双重循环:对于每一天的温度,向后遍历直到找到第一个更高的温度。这种方法的时间复杂度是O(n²),在数据量较大时性能会很差。
python复制def dailyTemperatures(T):
n = len(T)
result = [0] * n
for i in range(n):
for j in range(i+1, n):
if T[j] > T[i]:
result[i] = j - i
break
return result
虽然这种解法在小数据量下可以工作,但当温度列表长度达到10^5级别时,就会明显超时。这提示我们需要寻找更高效的算法。
2.2 单调栈的引入与优化
单调栈是解决这类"下一个更大元素"问题的利器。它的核心思想是维护一个栈,栈中的元素保持单调性(递增或递减)。对于本题,我们需要维护一个单调递减的栈。
具体思路是:
- 初始化一个空栈和结果数组
- 遍历温度数组
- 当当前温度大于栈顶温度时,弹出栈顶元素并计算天数差
- 将当前温度索引入栈
- 最后栈中剩余元素对应的结果为0
这种解法的时间复杂度是O(n),因为每个元素最多入栈和出栈一次。
3. 详细实现与代码解析
3.1 Python实现版本
python复制def dailyTemperatures(T):
stack = []
result = [0] * len(T)
for i, t
