1. 题目:
给定一个整数数组 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]
2. 我的代码:
class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: answer = [0] * len(temperatures) # 定义单调栈——单调递增栈 stack = [0] # 遍历 for i in range(1, len(temperatures)): # 大于则记录并弹出来 while temperatures[i] > temperatures[stack[-1]]: answer[stack[-1]] = i - stack[-1] stack.pop() if stack == []: break # 小于等于则进栈 stack.append(i) return answer
单调栈应对的题目类型就是:
寻找该元素右边或者左边第一个比它大或者小的元素
(这道题的单调栈记录的是索引,为了方便计算距离)
依次拿去元素,查看元素是否满足条件,即比栈口元素大,如果比栈口元素大,则弹出栈口元素,并且这时栈口元素已经找到了距离他最近的大值。所以先记录一下栈口元素的大值距离赋值给这个元素同索引的answer。
如果栈都空了,就没必要再比较了,因为会越界。
其余的情况,就是该元素小于等于栈口元素,所以存进去即可。