给定一个整数数组 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]
示例3:
输入: temperatures = [30,60,90]
输出: [1,1,0]
最简单的方法是暴力搜索,其时间复杂度是 O(n2) ,在个别执行用例时会超出时间限制。代码如下:
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
length=len(temperatures)
ans=[0]*length
for i in range(length-1):
if temperatures[i+1]>temperatures[i]:
ans[i]=1
else:
for j in range(i+1,length):
if temperatures[j]>temperatures[i]:
ans[i]=j-i
break
return ans
前向搜索的问题是需要二次循环,导致时间复杂度较高。
如果考虑逆向搜索,那么可以在 O(1) 时间复杂度内找到下一个气温更高的天气。该方法堪称绝妙,代码如下:
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
length = len(temperatures)
ans= [0] * length
# 必须逆序
for i in range(length - 2, -1, -1):
pos=i+1
# 只要前一天温度比现在的高
while temperatures[pos] <= temperatures[i]:
# 找到下一个比 temperatures[pos] 气温高的天气,与temperatures[i]进行比较
if ans[pos] > 0:
pos += ans[pos]
# 找不到下一个比 temperatures[pos] 气温高的天气,因为也没有比 temperatures[i] 气温高的天气,所以 ans[i] = 0
else:
pos=i
break
# 找到比i天的温度高的位置,计算结果存储即可
ans[i] = pos - i
return ans
单调栈 LeetCode 官方视频讲解:每日温度
思路:维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。
code:
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
stack=[]
length=len(temperatures)
ans=[0]*length
for i in range(length):
if not stack:
stack.append([i,temperatures[i]])
else:
while stack and temperatures[i]>stack[-1][1]:
ans[stack[-1][0]]=i-stack[-1][0]
stack.pop()
stack.append([i,temperatures[i]])
return ans