返回
从 LeetCode 算法题中探索天气温度分析的奥秘
后端
2023-09-16 16:05:04
理解算法题目标
题目 :
给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是给出第 i
天之后需要等待的天数,直到温度至少达到当天温度。如果第 i
天之后永远不会达到或超过当天温度,那么答案就是 0
。
示例 1:
输入:temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
输出:[1, 1, 4, 2, 1, 1, 0, 0]
示例 2:
输入:temperatures = [30, 40, 50, 60]
输出:[1, 1, 1, 0]
示例 3:
输入:temperatures = [30, 60, 90]
输出:[1, 1, 0]
巧用数据结构和算法
单调栈
对于这道算法题,我们可以借助数据结构——单调栈,来寻找下一个比当前温度高的天的下标,并计算它们之间的间隔。单调栈的特点是:栈顶元素始终是栈中最大的元素。
算法步骤
- 将第一个温度入栈。
- 对于后面的每个温度,与栈顶温度比较:
- 如果当前温度大于或等于栈顶温度,则弹出栈顶元素,直到栈顶温度小于当前温度。
- 将当前温度入栈。
- 当栈为空时,表示没有比当前温度更高的温度,则该天的间隔为
0
。 - 否则,栈顶元素即为下一个比当前温度高的天的下标。计算该下标与当前天的间隔,并将其存储在答案数组中。
代码实现
def dailyTemperatures(temperatures):
"""
:type temperatures: List[int]
:rtype: List[int]
"""
# 单调栈
stack = []
# 答案数组
answer = [0] * len(temperatures)
# 遍历温度数组
for i, temp in enumerate(temperatures):
# 如果栈不为空且当前温度大于栈顶温度
while stack and temperatures[stack[-1]] < temp:
# 弹出栈顶元素
top = stack.pop()
# 计算间隔
answer[top] = i - top
# 将当前温度入栈
stack.append(i)
return answer
代码复杂度分析
- 时间复杂度:O(n),其中 n 为温度数组的长度。
- 空间复杂度:O(n),因为单调栈的最大大小为 n。
结语
通过本文,我们从 LeetCode 算法题中学习了一种解决实际问题的技巧。我们通过单调栈这种数据结构,巧妙地解决了天气温度分析的问题。这种技巧不仅适用于此题,还可扩展到其他类似场景中。希望您能有所收获,并将其应用到未来的编程实践中。