返回

通俗讲解:单调栈算法让你轻松应对739. 每日温度

前端

单调栈算法:每日温度问题的利器

简介

单调栈是一种巧妙的数据结构,在解决一系列计算机科学问题中发挥着至关重要的作用。其基本思想是利用栈来跟踪元素的相对大小,使我们能够高效地识别最大或最小值。在本文中,我们将深入探究单调栈算法,并将其应用于解决一个经典的 LeetCode 难题——739. 每日温度。

单调栈算法原理

单调栈算法的构建依赖于一个简单的原则:栈中的元素必须按单调递减或递增的顺序排列。这意味着对于一个递减栈,栈顶元素始终是栈中最小的元素,而对于一个递增栈,栈顶元素始终是栈中最大的元素。

使用单调栈算法,我们可以通过以下步骤高效地跟踪一组元素的最大值:

  1. 创建一个空栈。
  2. 依次遍历元素数组。
  3. 对于每个元素:
    • 如果栈为空,则将元素压入栈中。
    • 如果栈不为空,则比较元素与栈顶元素。
    • 如果元素大于(递减栈)或小于(递增栈)栈顶元素,则将栈顶元素弹出并继续比较。
    • 重复步骤 3,直至找到一个比元素小(递减栈)或大的(递增栈)的元素。
    • 将元素压入栈中。

每日温度问题

每日温度问题是一个经典的算法问题,要求我们找出给定温度数组中每个元素之后第一个比其更高的温度出现的天数。例如,对于数组 [73, 74, 75, 71, 69, 72, 76, 73],我们应该返回 [1, 1, 4, 2, 1, 1, 0, 0]。

单调栈算法解决每日温度问题

我们可以使用递减单调栈算法巧妙地解决每日温度问题。以下是算法的详细步骤:

  1. 创建一个空栈。
  2. 依次遍历温度数组。
  3. 对于每个温度:
    • 如果栈为空,则将温度压入栈中。
    • 如果栈不为空,则比较温度与栈顶温度。
    • 如果栈顶温度比当前温度低,则弹出栈顶温度,并记录下其对应的索引(即天数)。
    • 继续比较,直至找到一个比当前温度高的温度。
    • 将当前温度压入栈中。
  4. 遍历结束后,栈中剩余的温度对应于没有更高温度的日期。
  5. 返回一个与输入数组长度相同的数组,其中每个元素的值为其之后第一个更高温度出现的天数,如果不存在更高的温度,则为 0。

Python 代码示例

def daily_temperatures(temperatures):
    stack = []
    result = [0] * len(temperatures)
    for i, temp in enumerate(temperatures):
        while stack and temp > temperatures[stack[-1]]:
            top = stack.pop()
            result[top] = i - top
        stack.append(i)
    return result

结论

单调栈算法是一个强大的工具,可以有效解决每日温度问题等一系列问题。通过利用栈来跟踪元素的相对大小,我们可以高效地识别最大值或最小值,并提取有价值的信息。掌握单调栈算法,将极大地提升你在算法和数据结构领域的技能。

常见问题解答

  1. 单调栈算法适用于哪些类型的数组?

    • 单调栈算法适用于需要跟踪元素最大值或最小值的数组。
  2. 单调栈算法的时间复杂度是多少?

    • 单调栈算法的时间复杂度为 O(n),其中 n 是数组的长度。
  3. 单调栈算法在空间上是否有效?

    • 单调栈算法在空间上是有效的,因为它只使用一个栈来存储元素。
  4. 除每日温度问题外,单调栈算法还可以解决哪些问题?

    • 单调栈算法还可以解决以下问题:
      • 下一个更大元素
      • 下一个较小元素
      • 柱状图中的最大矩形
  5. 如何改进单调栈算法的效率?

    • 可以在栈中存储元素的索引而不是元素本身,以进一步提高效率。