读懂每日温度,LeetCode 第 739 题大显身手
2023-12-26 11:32:27
征服 LeetCode 739:“每日温度”的巧妙解法
简介
如果你自诩为 LeetCode 的忠实粉丝,那么你一定对第 739 题“每日温度”了如指掌。这道看似平淡无奇的问题,实则蕴含着丰富的巧思和解题技巧。让我们一起深入剖析这道题,探寻它的巧妙解法。
理解题意
“每日温度”的目的是给定一个整数数组 temperatures
,其中每个元素表示某一天的温度。你的任务是计算出一个新的数组 answer
,其中 answer[i]
表示从第 i
天开始,需要等待的天数才能观测到更高的温度。如果第 i
天之后没有更高的温度,则 answer[i]
为 0。
例如,给定 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
,对应的 answer
应该为 [1, 1, 0, 2, 1, 1, 0, 0]
。原因如下:
- 第 2 天的温度 (74) 比第 1 天 (73) 高,需要等待 1 天。
- 第 3 天的温度 (75) 比第 2 天 (74) 高,需要等待 1 天。
- 第 4 天的温度 (71) 比第 3 天 (75) 低,需要等待 2 天。
- 依此类推...
解题思路
解决“每日温度”问题的最常见方法之一是使用单调栈 。单调栈是一种数据结构,它保持一个递减序列,并可以高效地找到序列中的最大元素。
以下是使用单调栈解决本题的步骤:
- 初始化 一个单调栈
stack
。 - 遍历
temperatures
数组中的每个温度temperature
。 - 循环检查
stack
中的温度是否比temperature
低。 - 如果
stack
中的温度比temperature
低,将它们弹出栈 。 - 计算当前温度与栈顶温度的差值 ,并更新
answer[i]
。 - 将
temperature
压入栈中 。
代码实现
def daily_temperatures(temperatures):
stack = []
answer = [0] * len(temperatures)
for i, temperature in enumerate(temperatures):
while stack and temperatures[stack[-1]] < temperature:
prev_index = stack.pop()
answer[prev_index] = i - prev_index
stack.append(i)
return answer
总结
LeetCode 739 “每日温度”是一道经典算法题,考验的是求解单调序列的技巧。通过使用单调栈,我们可以高效地找到序列中的最大元素,并据此计算出等待天数。掌握这道题的解法不仅可以提升你的算法能力,还能让你在其他类似问题中游刃有余。
常见问题解答
1. 单调栈是如何工作的?
单调栈维护一个递减序列,每个元素都比它之前的元素小。当你压入一个元素时,它会将所有小于它的元素弹出栈,确保栈顶元素始终是序列中的最大元素。
2. 为什么单调栈可以用来解决“每日温度”问题?
因为栈顶元素始终是当前观察到的最高温度。当我们遇到一个更高的温度时,我们可以通过计算它与栈顶元素的差值,得到从当前天开始需要等待的天数。
3. 这道题还有其他解法吗?
有,其他解法包括蛮力法、哈希表法和二分查找法。不过,单调栈法是解决此题的最快和最简单的方法之一。
4. 这道题有什么变形吗?
是的,一个常见的变形是“下一个更大元素”,它要求找到数组中每个元素的下一个比它大的元素。
5. 这道题在实际中有什么应用?
“每日温度”问题在气象学、金融和数据分析等领域都有应用。它可以用来预测天气、股价和销售趋势的变化。