返回

从 LeetCode 算法题中探索天气温度分析的奥秘

后端





理解算法题目标

题目

给定一个整数数组 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]

巧用数据结构和算法

单调栈

对于这道算法题,我们可以借助数据结构——单调栈,来寻找下一个比当前温度高的天的下标,并计算它们之间的间隔。单调栈的特点是:栈顶元素始终是栈中最大的元素。

算法步骤

  1. 将第一个温度入栈。
  2. 对于后面的每个温度,与栈顶温度比较:
    • 如果当前温度大于或等于栈顶温度,则弹出栈顶元素,直到栈顶温度小于当前温度。
    • 将当前温度入栈。
  3. 当栈为空时,表示没有比当前温度更高的温度,则该天的间隔为0
  4. 否则,栈顶元素即为下一个比当前温度高的天的下标。计算该下标与当前天的间隔,并将其存储在答案数组中。

代码实现

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 算法题中学习了一种解决实际问题的技巧。我们通过单调栈这种数据结构,巧妙地解决了天气温度分析的问题。这种技巧不仅适用于此题,还可扩展到其他类似场景中。希望您能有所收获,并将其应用到未来的编程实践中。