返回

读懂每日温度,LeetCode 第 739 题大显身手

前端

征服 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 天。
  • 依此类推...

解题思路

解决“每日温度”问题的最常见方法之一是使用单调栈 。单调栈是一种数据结构,它保持一个递减序列,并可以高效地找到序列中的最大元素。

以下是使用单调栈解决本题的步骤:

  1. 初始化 一个单调栈 stack
  2. 遍历 temperatures 数组中的每个温度 temperature
  3. 循环检查 stack 中的温度是否比 temperature 低。
  4. 如果 stack 中的温度比 temperature 低,将它们弹出栈
  5. 计算当前温度与栈顶温度的差值 ,并更新 answer[i]
  6. 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. 这道题在实际中有什么应用?
“每日温度”问题在气象学、金融和数据分析等领域都有应用。它可以用来预测天气、股价和销售趋势的变化。