写此系列博客的榜样来自:leetcode cookbook
单调栈
单调栈基础
作者:Shawxing精讲算法 链接:https://leetcode.cn/discuss/post/L5ZpxA/
在 O(n) 的时间复杂度内求出数组中各个元素右侧第一个更大的元素及其下标,然后一并得到其他信息。
原理




最终结果

代码
class Solution:
def monotonicStack(self, nums: List[int]) -> List[int]:
n = len(nums)
ans = [0] * n
st = []
for i, v in enumerate(nums):
while st and v > nums[st[-1]]:
prevI = st.pop()
ans[prevI] = i
# 还可以针对 prevI, i, nums[prevI], nums[i] 做些其他的处理
st.append(i)
return ans
总结与扩展 扩展并归纳一下,在 while 的执行条件中,将数组元素与栈顶元素比较时:
右侧第一个 更大(可相等) 元素对应 >= 右侧第一个 更大(不可相等) 元素对应 > 右侧第一个 更小元素(可相等) 元素对应 <= 右侧第一个 更小元素(不可相等) 元素对应 < 还可以镜像处理,逆向遍历数组并维护单调栈,得到各元素左侧相应的信息。
练习 可能涉及一些变形,但核心原理不变。
每日温度 下一个更大元素 I 下一个更大元素 II 柱状图中最大的矩形 接雨水及个人题解(这道题在面试中出现原题的几率较高,建议掌握最优的双指针解法即可)