主要内容
单调栈
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。
时间复杂度为O(n)。
题目
739. 每日温度
思路分析
从栈底到栈顶部是递减状态
当前元素小于等于栈顶,加入
当前元素大于栈顶,依次弹出小于当前元素的栈中元素,再把当前元素入栈
代码
class Solution:
# 从栈底到栈顶部是递减状态
# 当前元素小于等于栈顶,加入
# 当前元素大于栈顶,依次弹出小于当前元素的栈中元素,再把当前元素入栈
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
n = len(temperatures)
res = [0] * n
stack = []
for i, t in enumerate(temperatures):
# 弹出
while stack and t > temperatures[stack[-1]]:
preid = stack.pop()
res[preid] = i - preid
# 加入
stack.append(i)
return res
496. 下一个更大元素 I
代码
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
m, n = len(nums1), len(nums2)
res = [-1] * m
stack = []
for i in range(n):
# 弹出,记录
while stack and nums2[i] > nums2[stack[-1]]:
# 记录
nums2_id = stack.pop()
if nums2[nums2_id] in nums1:
nums1_id = nums1.index(nums2[nums2_id])
res[nums1_id] = nums2[i]
# 加入
stack.append(i)
return res