题目:
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
思路:
单调栈:寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置
栈顶到栈底:单调递增
cur<=top: 将下标idx入栈
cur>top:栈顶元素弹出,记录结果
解答:
方法一:暴力解法
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
#暴力解法
n=len(temperatures)
res=[0]*n
for i in range(n):
for j in range(i+1,n):
if temperatures[j]>temperatures[i]:
res[i]=j-i
break
return res
方法二:单调栈
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
#单调栈,栈顶到栈底单调递增(小了才入栈,打了计算结果)
n=len(temperatures)
res=[0]*n
stack=[]
i=0
while i<n:
if not stack:
stack.append(i)
i+=1
continue
top=stack[-1]
if temperatures[i]<=temperatures[top]:
stack.append(i)
i+=1
else:
#找到更高温度,记录结果
res[top]=i-top
stack.pop()
return res
简化:
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
#单调栈,栈顶到栈底单调递增(小了才入栈,打了计算结果)
n=len(temperatures)
res=[0]*n
stack=[]
for i in range(n):
while stack and temperatures[i]>temperatures[stack[-1]]:
#找到更高温度,记录结果
top=stack.pop()
res[top]=i-top
stack.append(i)
return res