题目难度: 困难
原题链接
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。
2-0 = 0
O(N)
: 只需要顺序和逆序各遍历 1 次O(N)
: 维护了长度为 N 的左侧最高高度列表class Solution:
def trap(self, height: List[int]) -> int:
# 维护当前柱子的左侧最高高度
lmxs = []
lmx = 0
for h in height:
# 正序遍历, 记录左侧最高高度
lmxs.append(lmx)
# 注意左侧最高高度不能是柱子本身, 所以先追加再更新
lmx = max(lmx, h)
rmx = 0
res = 0
for i in range(len(height))[::-1]:
# 逆序遍历, 记录右侧最高高度
# 注意这里无需列表, 直接更新当前最大值即可
h = height[i] # 当前柱子高度
bh = min(lmxs[i], rmx) # 桶高度
if bh > h:
# 桶高度大于当前柱子高度, 则其高度差就是蓄水量
res += bh - h
# 右侧最高高度同样不能是柱子本身
rmx = max(rmx, h)
return res
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~