题目来源于LeetCode
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
方法:使用单调栈。找到中间凹槽位置,并利用单调栈找出其左边的第一个最高柱子,右边的第一个最高柱子即循环遍历到的这一个元素。
# 单调栈(单增栈)
# 若当前遍历元素大于栈顶元素,则出现凹槽
height = [4, 2, 0, 3, 2, 5]
list = []
s = 0
for i, v in enumerate(height):
while list and v > height[list[-1]]:
top = list.pop()
if list:
left = list[-1]
wid = i - left - 1
hei = min(height[left], height[i]) - height[top]
s += wid * hei
else:
break
list.append(i)
print(s) # 9