文章目录
前言

单调栈: 方向从栈顶到栈底
如果递增,求右边第一个比它大的数值
如果递减,求右边第一个比它小的数值
739. 每日温度

思路
只需要遍历一遍
单调栈的作用:存放之前遍历过的元素 ,这里使用单调增
在使用单调栈的时候首先要明确如下几点:
-
单调栈里存放的元素是什么?
单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。 -
单调栈里元素是递增呢? 还是递减呢?
注意以下讲解中,顺序的描述为 从栈头到栈底的顺序;递增; -
操作过程
- 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况:压栈
- 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况:根据题目,压栈
- 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况:while语句,如果满足大于的条件,那么计算出st.top对应的result中的结果:i-st.top();知道T【i】小于T【top】的值,压栈

方法一
注意stack要判断不为空
class Solution(object):
def dailyTemperatures(self, temperatures):
"""
:type temperatures: List[int]
:rtype: List[int]
"""
result = [0]*len(temperatures)
stack = [0]#压入第一个元素
for i in range(1,len(temperatures)):
if stack and temperatures[i] <= temperatures[stack[-1]]:#如果当前元素小于栈顶元素
stack.append(i)#压栈
else:
while stack and temperatures[i] > temperatures[stack[-1]]:
result[stack[-1]] = i - stack[-1]
stack.pop()
stack.append(i)
return result
496.下一个更大元素 I

思路
题目有点绕,但是是一样的,针对nums2进行处理,如果找到了栈顶元素的第一个大于它的值,看看这个栈顶元素是否在nums1里面,如果在的话就给出结果,不在pop出来就行
评论区的思路:一样的,但是更加简单,先把上一题对应的res求出来之后,对着nums1来找结果就行
方法一
我这里有点不一样,stack里面没放坐标了,直接放的元素,
class Solution(object):
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
res = [-1] * len(nums1)#存储结果矩阵
stack = [nums2[0]]#存放nums2中的值
for i in range(1,len(nums2)):
if nums2[i] <= stack[-1]:
stack.append(nums2[i])
else:
while stack and nums2[i] > stack[-1]:
if stack[-1] in nums1:
index_nums1 = nums1.index(stack[-1])
res[index_nums1] = nums2[i]
stack.pop()
stack.append(nums2[i])
return res
503.下一个更大元素II

思路
处理环形数组✨💕🩷🩷🩷🩷🩷
思路一: 拼一下,形成一个新数组;最后取结果只需要取前面一半的内容;但是需要开辟新数组

最低0.47元/天 解锁文章
1233

被折叠的 条评论
为什么被折叠?



