
他向远方望去,无法看到高山背后的矮山,只看到一座座更高的山峰。
推荐先做做 数据结构题单 中的「枚举右,维护左」以及第三章「栈」的基础题目后,再来刷本题单。
一、单调栈
§1.1 基础
原理讲解:单调栈【基础算法精讲 26】
模板:
Python3
Java
C++
Go
# 返回 left,其中 left[i] 是 nums[i] 左侧最近的严格大于 nums[i] 的数的下标,若不存在则为 -1
# 时间复杂度 O(len(nums))
def left_greater(nums: list[int]) -> list[int]:
n = len(nums)
left = [-1] * n
st = []
for i, x in enumerate(nums):
while st and nums[st[-1]] <= x: # 如果求严格小于,改成 >=
st.pop()
if st:
left[i] = st[-1]
st.append(i)
return left
# 返回 right,其中 right[i] 是 nums[i] 右侧最近的严格大于 nums[i] 的数的下标,若不存在则为 len(nums)
# 时间复杂度 O(len(nums))
def right_greater(nums: list[int]) -> list[int]:
n = len(nums)
right = [n] * n
st = []
for i in range(n - 1, -1, -1):
x = nums[i]
while st and nums[st[-1]] <= x: # 如果求严格小于,改成 >=
st.pop()
if st:
right[i] = st[-1]
st.append(i)
return right§1.2 进阶
- 3676. 碗子数组的数目 1848
- 456. 132 模式 约 2000
- 3113. 边界元素是最大值的子数组数目 2046
- 2866. 美丽塔 II 2072
- 975. 奇偶跳 2079
- 1944. 队列中可以看到的人数 2105
- 2454. 下一个更大元素 IV 2175
- 654. 最大二叉树 做到
- 1130. 叶值的最小代价生成树 做到
- 2289. 使数组按非递减顺序排列 2482
- 2736. 最大和查询 2533
- 3420. 统计 K 次操作以内得到非递减子数组的数目 2855 树形结构
- 3221. 最大数组跳跃得分 II(会员题)
- 1966. 未排序数组中的可被二分搜索的数(会员题)
- 2832. 每个元素为最大值的最大范围(会员题)
- 1063. 有效子数组的数目(会员题)
- 1950. 所有子数组最小值中的最大值(会员题)
- 2282. 在一个网格中可以看到的人数(会员题)
- 3555. 排序每个滑动窗口中最小的子数组(会员题)做到
思维扩展:
- 1019. 链表中的下一个更大节点 1571
- 962. 最大宽度坡 1608
- 853. 车队 1678
- 768. 最多能完成排序的块 II 1788
- 3814. 预算下的最大总容量 1796
- 2054. 两个最好的不重叠活动 1883
- 3542. 将所有元素变为 0 的最少操作次数 1890
- 1124. 表现良好的最长时间段 1908
- 1340. 跳跃游戏 V 做到
- 1776. 车队 II 2531
- 2863. 最长半递减子数组的长度(会员题)
- 2355. 你能拿走的最大图书数量(会员题)
二、矩形
- 84. 柱状图中最大的矩形
- 1793. 好子数组的最大分数 1946
- 85. 最大矩形
- 221. 最大正方形
- 4016. 两个不重叠子正方形的最大面积 1959
- 42. 接雨水 做法不止一种
- 1504. 统计全 1 子矩形
- 1277. 统计全为 1 的正方形子矩阵
- 755. 倒水(会员题)
思维扩展:
- 1727. 重新排列后的最大子矩阵 1927 注:不是单调栈,但有一些共同的思路
三、贡献法
- 907. 子数组的最小值之和 1976
- 2104. 子数组范围和(最大值-最小值) 做法难度大约 2000
- 1856. 子数组最小乘积的最大值 2051
- 3878. 统计好子数组 2230
- 2818. 操作使得分最大 2397
- 2281. 巫师的总力量和(最小值×和) 2621
- 3430. 最多 K 个元素的子数组的最值之和 2645
- 3359. 查找最大元素不超过 K 的有序子矩阵(会员题)矩形
思维扩展:
- 2334. 元素值大于变化阈值的子数组 2381
- 2962. 统计最大元素出现至少 K 次的子数组·我的题解 中的思考题(解答见评论)
四、最小字典序
- 402. 移掉 K 位数字 约 1800
- 1673. 找出最具竞争力的子序列 1802
- 316. 去除重复字母 2185
- 316 扩展:重复个数不超过 limit
- 1081. 不同字符的最小子序列 同 316 题
- 3816. 删除重复字符后的字典序最小字符串 2377
- 321. 拼接最大数
- 2030. 含特定字母的最小子序列 2562
关联题单
算法题单
- 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环)
- 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
- 单调栈(基础/矩形面积/贡献法/最小字典序)
- 网格图(DFS/BFS/综合应用)
- 位运算(基础/性质/拆位/试填/恒等式/思维)
- 图论算法(DFS/BFS/拓扑排序/基环树/最短路/最小生成树/网络流)
- 动态规划(入门/背包/划分/状态机/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
- 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
- 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
- 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
- 链表、树与回溯(前后指针/快慢指针/DFS/BFS/直径/LCA)
- 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)
欢迎关注 B站@灵茶山艾府
如果你发现有题目可以补充进来,欢迎评论反馈。
评论 (107)


