题目解释
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
解题思路
题目有几个特性可用,bar width = 1,然后第一个和最后一个是不能trap water,其次中间的部分能trap多少水是看左右高度差较低的那个 - 本身的高度
基本思想是我们将两个指针l
l和r
设置在高度的左右两端。 然后,我们获得这些指针的最小高度(min_height
)(类似于由于漏桶效应导致水量最多的容器),因为水位不能高于它。 然后,我们将两个指针移向中心。 如果即将到来的水位小于min_height
,那么它将容纳一些水。 加水,直到遇到“障碍物”(高度大于min_height
),并更新l和r以新的间隔重复此过程。
代码实现
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
l, r, water, min_height = 0, len(height) - 1, 0, 0
while l < r:
min_height = min(height[l], height[r])
while l < r and height[l] <= min_height:
water += min_height - height[l]
l += 1
while l < r and height[r] <= min_height:
water += min_height - height[r]
r -= 1
return water