接雨水

42. 接雨水

给定 n 个非负整数表示每个宽度为 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<right:
        if height[left] < height[right]:
            if height[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
posted @ 2020-04-02 09:32  鱼与鱼  阅读(135)  评论(0编辑  收藏  举报