接雨水问题的栈解法

接雨水问题的栈解法

作者:Elara发布时间:2026-07-22 12:21阅读时长:19 分钟阅读次数:10
常见问答
Q
为什么“接雨水问题”适合用栈来做?

我在做接雨水题时,常常会想到双指针或动态规划。相比这些方法,栈解法的核心优势是什么?它是如何帮助我快速判断某一段位置能接多少水的?

A

栈可以帮助定位“边界”并按层计算积水

栈解法适合这类题,是因为它能够保存一组单调递减的柱子位置,用来寻找能形成积水的左右边界。当遍历到一个比栈顶更高的柱子时,说明可能出现了一个“右边界”,此时可以把栈顶柱子作为凹槽底部,结合新的右边界和栈中新的左边界计算这段区域的积水量。这个过程能把复杂的区间问题转化成一次遍历中的局部计算。

Q
栈解法里单调栈到底该维护什么状态?

我看到很多代码都在维护一个单调栈,但不太清楚栈里存的是高度还是下标。对于接雨水来说,栈中元素应该记录什么,才能方便我计算宽度和高度?

A

通常维护的是下标,而不是直接存高度

在接雨水的栈解法中,一般建议栈里保存柱子的下标。这样做的好处是,遇到新柱子时,可以直接通过下标获取高度,也能顺手计算左右边界之间的距离,也就是宽度。积水量的计算需要同时知道宽度和有效高度,因此保存下标更方便。如果只存高度,计算区间长度会变得不直观,处理起来也更容易出错。

Q
遇到栈顶元素比当前柱子低时,为什么能计算一段雨水?

在遍历高度数组时,如果当前高度比栈顶还高,代码会弹出元素并计算雨水。我想理解这一步背后的逻辑:为什么弹栈后就能确认有一部分水被围住了?

A

因为当前柱子补齐了右边界

当当前柱子的高度大于栈顶高度时,说明栈顶位置对应的凹陷底部有机会被围起来。弹出栈顶后,如果栈内还有元素,那么新的栈顶就是左边界,而当前柱子就是右边界。此时左右边界都已出现,中间被弹出的柱子就成了低洼底部,能够形成积水。积水高度取左右边界中较矮的一侧减去底部高度,积水宽度则是左右边界之间的距离减去中间底部本身。

Q
这种栈解法和双指针相比,适合什么场景?

我在准备面试时,发现接雨水题有多种解法。栈解法和双指针法各有什么使用特点?在什么情况下我更应该优先想到栈?

A

栈更适合帮助你理解局部凹槽的形成过程

双指针法通常更简洁,空间复杂度也更低,适合追求高效实现的场景。栈解法则更适合分析“每一段水是怎么被围出来的”,逻辑更具过程感,便于理解局部积水的形成机制。如果你想在面试中展示对单调结构的掌握,或者想更直观地拆解某个凹槽的边界关系,栈解法会很有表现力。

* 文章含AI生成内容