739 每日温度
题目 739 每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[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]
思路
-
两个for循环可得到结果,时间复杂度是O(n^2)。
-
那么接下来在来看看使用单调栈的解法。
那有同学就问了,我怎么能想到用单调栈呢? 什么时候用单调栈呢?
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。
例如本题其实就是找找到一个元素右边第一个比自己大的元素。
具体单调栈的思路想法可以参考b站视频单调栈其实很简单,加上自己用笔在纸上画画,很容易就理解了,我们这里采用的是单调递增栈(从栈顶到栈底)。注意:不建议参考代码随想录,那里把问题有些复杂化了感觉。 -
代码里就考虑了两种情况,什么时候入栈,什么时候出栈且更新结果。当元素大于栈顶元素时,就出栈且更新结果,当元素小于栈顶元素时就直接入栈。至于代码里为什么考虑了栈是否为空,因为可能会出现元素会连续大于栈顶元素好多次,所以循环考虑。
代码
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack = [0]
res = [0 for _ in range(len(temperatures))]
for i in range(len(temperatures)):
# 如果栈不为空且元素大于栈顶元素,更新结果,且出栈
while stack != [] and temperatures[i] > temperatures[stack[-1]]:
res[stack[-1]] = i - stack[-1]
stack.pop()
# 栈为空或者元素小于小于栈顶元素,就直接入栈
stack.append(i)
return res