📅  最后修改于: 2023-12-03 15:11:31.852000             🧑  作者: Mango
开发一个函数,输入一个由表示每天温度的数字组成的列表,输出在这个列表中,有多少个元素是比后续的元素温度更高的。具体而言,如果在第 i 天之后有某一天的温度更高,则称这是一个“第 i 天的温度更高”元素。要求只使用 O(n) 的时间复杂度。
输入: [73, 74, 75, 71, 69, 72, 76, 73]
输出: [1, 1, 4, 2, 1, 1, 0, 0]
解释:
输入: [89, 87, 74, 91, 83]
输出: [0, 0, 1, 0, 0]
解释:
暴力遍历数组,对于给定的元素 i,对于后续的元素 j 从 i+1 开始遍历,如果有比元素 i 更高的温度,则输出 j-i。如果整个数组都遍历结束后都没有比元素 i 更高温度的,那么输出 0。
时间复杂度:$O(n^2)$
单调栈是一个很好的工具,在这道题目中也是非常适用的。我们沿着温度数组从左往右遍历,对于在单调栈中未被抵消的元素,我们可以保证他们在向右遍历的过程中一定还没有找到更高的温度。具体来讲,我们创建一个单调栈,从左往右遍历数组时元素入栈。对于每一个新元素,如果当前栈顶不为空,那么弹出栈顶元素,直到栈为空或者栈顶元素大于当前元素。弹出一个元素说明找到了第一个比它更高温度的元素。由于弹出后,栈顶元素已经比当前元素更低温度了,那么它就成为了当栈顶元素向右遍历时的第一个比它高温度的元素,把弹出的栈顶元素入栈。由于栈内元素肯定是递减的,那么在栈后面的元素都比栈前的元素更高温度,可以直接求得俩元素的下标差,即第 i 个元素比第 j 个元素高的差值为 j-i。
时间复杂度:$O(n)$
def dailyTemperatures(T: List[int]) -> List[int]:
res = []
n = len(T)
for i in range(n):
for j in range(i + 1, n):
if T[j] > T[i]:
res.append(j - i)
break
else:
res.append(0)
return res
def dailyTemperatures(T: List[int]) -> List[int]:
n = len(T)
stack = []
res = [0] * n
for i in range(n):
while stack and T[i] > T[stack[-1]]:
j = stack.pop()
res[j] = i - j
stack.append(i)
return res
这道题目还是不太简单的,不过刷一些题目以后,我们也能够学会一些更好的算法方法。这里给出的方法一和方法二,在解决其他问题的时候或多或少都会使用得到。作为一名优秀的程序员,一定要对算法思路深入理解,才能在真正需要的时候快速找到解决问题的方法。