直观解剖:用填充标记每日温度的转折点
2023-12-11 00:23:12
题目背景
在一个温暖的国度里,每天的气温都会被记录下来,形成一个温度数组。现在,你作为一名气象爱好者,想要知道在某一天观察到的温度,需要等待几天才能超过该天的温度。
解题思路
这道题乍一看有些绕,但其实我们可以用一个简单而巧妙的方法来解决它。具体来说,我们可以使用数组的 fill()
方法来标记转折点,然后遍历数组计算等待天数。
具体步骤
-
标记转折点
首先,我们需要找出数组中的转折点。转折点是指数组中比前一天温度更高的点。我们可以使用
fill()
方法来标记这些转折点。具体来说,对于每个转折点,我们将其后面的所有元素都填充为它本身。这样,我们就标记出了数组中的所有转折点。 -
计算等待天数
标记完转折点后,我们就可以遍历数组计算等待天数了。对于每个元素,如果它不是转折点,那么它需要等待的天数就是它距离下一个转折点的距离。如果它是转折点,那么它需要等待的天数就是 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]
。
-
标记转折点
首先,我们需要找出数组中的转折点。转折点是数组中比前一天温度更高的点。我们可以使用
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]
从输出结果可以看出,数组中的转折点是
75
和76
。 -
计算等待天数
标记完转折点后,我们就可以遍历数组计算等待天数了。对于每个元素,如果它不是转折点,那么它需要等待的天数就是它距离下一个转折点的距离。如果它是转折点,那么它需要等待的天数就是 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 题海中乘风破浪,所向披靡!