单调栈基础与直方图与接雨水类

共 17 题
#

1. 为什么单调栈每个元素最多入栈出栈一次,从而整体 O(n)

A 单调栈的时间复杂度取决于每轮 while 循环弹出的元素个数,平均为 O(n log n)
B 单调栈的每个元素最多入栈一次、出栈一次,总操作数 O(n),故整体 O(n) ✓ 正确答案
C 单调栈的空间复杂度是 O(n),但时间复杂度无法保证是线性的
D 单调栈的时间复杂度是 O(n²),因为最坏情况下每个元素可能被多次比较
#

2. 为什么接雨水的单调栈要维护递减(收集左侧更矮的墙)

A 应维护单调递增栈,因为需要收集右侧更矮的墙
B 应维护单调递减栈,弹出被左右更高墙夹住的较矮墙来计算水量 ✓ 正确答案
C 单调栈解法无法处理高度相等的情况
D 接雨水只需要栈顶元素,不需要记录左右两侧的墙
#

3. 如何用单调递减栈求数组中每个元素的下一个更大元素(Next Greater)

A 时间复杂度为 O(n log n),因为需要排序
B 从右往左扫描时,维护递增栈,栈顶表示当前元素的下一个更大元素
C 从右往左扫描时,弹出所有小于等于当前元素的栈顶,栈顶的剩余元素即下一个更大元素 ✓ 正确答案
D 相等元素必须保留在栈中,否则会错过答案
#

4. 循环数组(LeetCode 503)如何用"遍历两遍+取模"处理环绕

A 需要遍历两遍(2n 个位置),用下标取模 i % n 访问真实下标,答案覆盖前 n 个 ✓ 正确答案
B 循环数组的每个元素都一定有下一个更大元素
C 只需遍历一遍 n 个元素即可,因为循环数组答案必然在后方
D 取模会让下标越界,因此必须先复制数组
#

5. 接雨水双指针 O(1) 空间法相比单调栈的取舍

A 双指针法无法处理高度相等的墙
B 双指针法空间复杂度 O(n),与单调栈相同
C 双指针法必须同时移动左右指针,不能只移动一侧
D 双指针法时间复杂度 O(n),空间复杂度 O(1),比单调栈省空间 ✓ 正确答案
#

6. 接雨水(42)单调栈解法的"左右墙夹底"水量累加逻辑

A 该底部右侧整列的水量
B 全部蓄水量一次性算出
C 左墙与右墙之间、以底部为最低点的那一层的水平水量 ✓ 正确答案
D 从数组起点到当前墙的总水量
#

7. 柱状图最大矩形(84)如何用单调递增栈找每根柱的左右边界

A 每根柱子的最大矩形宽度就是它与数组边界的距离
B 弹出的柱子 t 的左边界是弹出后新栈顶(左边第一个更矮),右边界是当前柱子 i(右边第一个更矮) ✓ 正确答案
C 递增栈弹出的柱子,其左边界是栈顶上方、右边界是当前次矮的柱子
D 需要维护递减栈才能找到左右边界
#

8. 每日温度(739)与在线股票跨度(901)的本质是否都是 Next Greater

A 每日温度需要动态规划,不能使用单调栈
B 股票跨度求的是右边下一个更大元素的天数
C 两者完全不同,股票跨度是贪心问题
D 两者本质都是 Next Greater 的变体,一个求右边下一个更大、一个求左边前一个更大 ✓ 正确答案
#

9. 接雨水的双指针解法中左右指针中较矮一侧决定当前水量,移动规则是什么?

A 始终移动右指针直到相遇
B 移动较高一侧指针,因为较高一侧决定水量
C 移动较矮一侧指针并结算该位置水量,因为 min 由较矮一侧决定 ✓ 正确答案
D 同时移动左右两侧指针
#

10. 单调栈存储索引而非值的必要性(便于算距离/区间长度)

A 存储索引便于通过下标差计算距离/区间长度,同时仍可用数组回查值 ✓ 正确答案
B 存储索引是为了省内存,因为值更大
C 存储索引是因为数组下标本身有大小关系
D 存储值更方便,因为不需要回查
#

11. 如何判断一道题"该用单调栈",题目中出现"最近/边界/跨度"的线索

A 单调栈仅在处理字符串时使用
B 只要题目涉及排序,就必须用单调栈
C 单调栈只适用于求最大值,不适用于求最小值
D 出现"最近/第一个更大更小/边界/跨度/连续段"等要求时,优先考虑单调栈 ✓ 正确答案
#

12. Maximal Rectangle(85)如何把矩阵逐行转化为直方图复用 84

A 需要把每一列单独转换为直方图,与行无关
B 转化后无法复用 84 的单调栈解法
C 高度数组每行都重置为 0,不累积
D 每一行独立计算,把 1 的个数作为高度,再用单调栈求每行最大矩形 ✓ 正确答案
#

13. 含障碍/unbounded 的接雨水变种如何调整边界处理

A 无论有无障碍,蓄水公式都完全不变
B 边界不封闭时水反而存得更多
C 障碍必须被当作墙来蓄水
D 单调栈法弹出底部后若栈为空(左侧无墙),则无法蓄水应跳过 ✓ 正确答案
#

14. 如何把"最大矩形/接雨水"抽象成"找比当前更小/更大的左右邻"

A 两者没有任何共同点,算法完全不同
B 两者都需要哈希表来记录左右邻
C 只有最大矩形需要找左右邻,接雨水不需要
D 两者都可归结为"求每个元素更小/更大的左右邻"从而由单调栈统一解决 ✓ 正确答案
#

15. 单调递增栈求前一个更小元素(Previous Smaller)的实现要点

A 前一个更小元素可以通过哈希表 O(1) 求解
B 需要从右往左扫描并维护递减栈
C 维护递减栈,新元素直接压栈即可
D 维护递增栈,新元素弹出所有大于等于它的栈顶,剩余栈顶即前一个更小 ✓ 正确答案
#

16. 最大矩形中如何用一个单调递增栈同时弹出求 left/right 边界

A 左右边界都需要额外数组记录
B 左边界是弹出后的新栈顶(或 -1),右边界是触发弹出的当前柱子 i ✓ 正确答案
C 左边界是数组起点,右边界是数组终点
D 左边界是当前柱子 i,右边界是栈顶
#

17. 如何把"下一个更大/更小"统一成模板(哨兵+方向)避免记忆多套

A 方向决定比较符号,二者绑定
B 统一模板靠"扫描方向(左右)决定下一个/前一个"+"比较符号(<>)决定更大/更小"+"哨兵清栈" ✓ 正确答案
C 哨兵是为了增加空间复杂度
D 四种变体完全无法统一,必须分别记忆