1. 引言
单调栈是一种特殊的栈,它保证了栈中的元素按照某种顺序排列。在处理数组或列表时,单调栈可以用来解决一系列问题,例如最大栈、最小栈等。本文将介绍如何使用单调栈解决一个经典问题:接雨水。
2. 问题分析
接雨水问题可以描述为:给定一个非空整数数组,表示一条由若干个非负整数组成的条形形,计算这条形形可以接住的水量。例如,给定数组 [0,1,0,2,1,0,1,3,2,1,2,1],可以接住的水量为 6。
3. 解题思路
我们可以使用单调递减栈来解决这个问题。具体步骤如下:
- 初始化一个空栈和一个变量
res用于存储结果。 - 遍历数组,对于每个元素:
- 如果栈为空或当前元素大于栈顶元素,则将当前元素入栈。
- 如果当前元素小于栈顶元素,则计算当前元素与栈顶元素之间的距离,并将栈顶元素出栈。计算栈顶元素所在位置与当前元素位置之间的距离(记为
dist),以及栈顶元素所在位置与栈顶元素下一个元素位置之间的距离(记为height)。将height * dist加到res上,并重复步骤 2。
- 返回
res。
4. 代码实现
以下是使用 Python 实现的接雨水问题的代码:
def trap(height):
stack = []
res = 0
for i, h in enumerate(height):
while stack and h < stack[-1][0]:
dist, height = stack.pop()
res += (min(height, h) - dist) * dist
stack.append((h, i))
return res
# 测试代码
height = [0,1,0,2,1,0,1,3,2,1,2,1]
print(trap(height)) # 输出:6
5. 总结
通过使用单调栈,我们可以轻松解决接雨水问题。单调栈的应用非常广泛,可以用于解决各种数组或列表相关问题。希望本文能够帮助您更好地理解和掌握单调栈。
