# 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 四种变体完全无法统一,必须分别记忆