接雨水

42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

接雨水_第1张图片

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
# 暴力法,当前位置 与 其左右最大值的最小值  之差
def trap(height):
    if not height:
        return 0
    ans = 0
    for i in range(1,len(height)):
        maxleft,maxright = 0,0
        for j in range(i+1):
            maxleft = max(maxleft,height[j])
        for j in range(i,len(height)):
            maxright = max(maxright,height[j])
        ans += min(maxleft,maxright)-height[i]
    return ans
#动态编程 存储最大值
def trap(height):
    if not height:
        return 0
    ans = 0
    maxleft,maxright = [0]*len(height),[0]*len(height)
    maxleft[0] = height[0]
    maxright[-1] = height[-1]
    
    for i in range(1,len(height)):
        maxleft[i] = max(maxleft[i-1],height[i])
    
    for i in range(len(height)-2,-1,-1):
        maxright[i] = max(maxright[i+1],height[i])
        
        
    for i in range(1,len(height)):
        ans += min(maxleft[i],maxright[i])-height[i]
    return ans,maxleft,maxright
# 双指针 一次遍历
def trap(height):
    ans = 0
    left,right = 0,len(height)-1
    leftmax,rightmax = 0,0
    
    while left leftmax:
                leftmax = height[left]
            else:
                ans += leftmax - height[left]
            left += 1
        else:
            if height[right] > rightmax:
                rightmax = height[right]
            else:
                ans += rightmax - height[right]
            right -= 1
    return ans

你可能感兴趣的:(接雨水)