Leetcode 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

方法1:

按列来看,找每一个列的左边最高值和右边最高值

动态规划思想:left_max[i]=max(left_max[i-1],height[i])    right_max[i]=max(right_max[i+1],height[i])

有关某个点的左右两个值得问题,都要这样做,与双指针有关系

class Solution:
    def trap(self, height: List[int]) -> int:
        res=0
        #动态规划
        left_max=[0 for x in range(len(height))]
        right_max=[0 for x in range(len(height))]
        for i in range(1,len(height)):
            left_max[i]=max(left_max[i-1],height[i])
        for j in range(len(height)-2,0,-1):
            right_max[j]=max(right_max[j+1],height[j+1])
        for k in range(1,len(height)-1):
            res+=max(min(left_max[k],right_max[k])-height[k],0)
        return res
 
 
方法2:双指针
从方法1中可以看出,left是左边的最大更新到最后结果中的,right是右边最大更新过来的
那么,如果最终结果与left有关系,那么肯定是左边最大很小的情况下
反之,右边最大很小
class Solution:
    def trap(self, height: List[int]) -> int:
        if not height or len(height)==0:return 0
        res=0
        left_max=height[0]
        right_max=height[len(height)-1]
        left=1
        right=len(height)-2
        while left<=right:
            if left_max<max(height[right],right_max):
                res+=max(left_max-height[left],0)
                left_max=max(left_max,height[left])
                left+=1
            else:
                res+=max(right_max-height[right],0)
                right_max=max(right_max,height[right])
                right-=1
        return res

 

posted @ 2020-05-05 17:09  王毅2016  阅读(127)  评论(0编辑  收藏  举报