每日温度-力扣
思路
- 什么时候用单调栈?
答:一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。
时间复杂度O(n) - 使用单调栈的要点是什么?
1、单调栈里存放的是什么?
答:存放元素的下标i,如果需要使用对应的元素,直接T[i]就可以获取
2、单调栈里元素是递增呢? 还是递减呢?
答:从栈头到栈底的顺序,本题是递增 - 使用单调栈主要有三个判断条件。
当前遍历的元素T[i]小于栈顶元素T[st[-1]]的情况:st.append(i)
当前遍历的元素T[i]等于栈顶元素T[st[-1]]的情况:st.append(i)
当前遍历的元素T[i]大于栈顶元素T[st[-1]]的情况:result[st[-1]]=i-st[-1]
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
answer=[0]*len(temperatures)
#栈存放元素下标,从0开始
stack=[0]
#从1开始遍历原数组
for i in range(1, len(temperatures)):
#栈头到栈尾是递增的
if temperatures[i] <= temperatures[stack[-1]]:
stack.append(i)
else:
#当前元素比栈头大,更新结果数组,并弹出栈头元素,直到栈头元素大于当前元素
while len(stack)!=0 and temperatures[i] > temperatures[stack[-1]]:
answer[stack[-1]]=i-stack[-1]
stack.pop()
stack.append(i)
return answer