返回

直观解剖:用填充标记每日温度的转折点

前端

题目背景

在一个温暖的国度里,每天的气温都会被记录下来,形成一个温度数组。现在,你作为一名气象爱好者,想要知道在某一天观察到的温度,需要等待几天才能超过该天的温度。

解题思路

这道题乍一看有些绕,但其实我们可以用一个简单而巧妙的方法来解决它。具体来说,我们可以使用数组的 fill() 方法来标记转折点,然后遍历数组计算等待天数。

具体步骤

  1. 标记转折点

    首先,我们需要找出数组中的转折点。转折点是指数组中比前一天温度更高的点。我们可以使用 fill() 方法来标记这些转折点。具体来说,对于每个转折点,我们将其后面的所有元素都填充为它本身。这样,我们就标记出了数组中的所有转折点。

  2. 计算等待天数

    标记完转折点后,我们就可以遍历数组计算等待天数了。对于每个元素,如果它不是转折点,那么它需要等待的天数就是它距离下一个转折点的距离。如果它是转折点,那么它需要等待的天数就是 0。

代码实现

def daily_temperatures(temperatures):
    """
    :type temperatures: List[int]
    :rtype: List[int]
    """
    # 标记转折点
    n = len(temperatures)
    next_warmer = [0] * n
    for i in range(n - 2, -1, -1):
        j = i + 1
        while j < n and temperatures[j] <= temperatures[i]:
            j = next_warmer[j]
        next_warmer[i] = j

    # 计算等待天数
    result = [0] * n
    for i in range(n - 1):
        result[i] = next_warmer[i] - i

    return result

举个例子

假设我们有一个温度数组 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]

  1. 标记转折点

    首先,我们需要找出数组中的转折点。转折点是数组中比前一天温度更高的点。我们可以使用 fill() 方法来标记这些转折点。具体来说,对于每个转折点,我们将其后面的所有元素都填充为它本身。

    temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
    next_warmer = [0, 0, 0, 0, 0, 0, 0, 0]
    
    for i in range(n - 2, -1, -1):
        j = i + 1
        while j < n and temperatures[j] <= temperatures[i]:
            j = next_warmer[j]
        next_warmer[i] = j
    
    print(next_warmer)
    

    输出结果:

    [0, 0, 6, 6, 6, 6, 0, 0]
    

    从输出结果可以看出,数组中的转折点是 7576

  2. 计算等待天数

    标记完转折点后,我们就可以遍历数组计算等待天数了。对于每个元素,如果它不是转折点,那么它需要等待的天数就是它距离下一个转折点的距离。如果它是转折点,那么它需要等待的天数就是 0。

    temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
    next_warmer = [0, 0, 6, 6, 6, 6, 0, 0]
    
    result = [0] * n
    for i in range(n - 1):
        result[i] = next_warmer[i] - i
    
    print(result)
    

    输出结果:

    [1, 1, 0, 3, 3, 1, 0, 1]
    

    从输出结果可以看出,每个元素需要等待的天数就是它距离下一个转折点的距离。

总结

这道题看似复杂,但其实我们可以用一个简单而巧妙的方法来解决它。具体来说,我们可以使用数组的 fill() 方法来标记转折点,然后遍历数组计算等待天数。希望这篇文章对你有帮助,祝你在 leetcode 题海中乘风破浪,所向披靡!