LeetCode Trapping Rain Water

LeetCode解题之Trapping Rain Water


原题

计算一个凹凸不平的模型中可以存放多少的雨水。以下图为例,黑色的地方是砖块,蓝色的地方是积水。

rainwatertrap

注意点:

  • 给的参数数组表示的是砖块的高度(它自身也要占面积),不只是边
  • 不会存在负数的情况

例子:

输入: height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

注:具体看上图

解题思路

这题与 Container With Most Water 非常相似,但那题只需要求出面积最大的积水处,而现在要找到所有的积水处的总和。现在考虑任意的一个块砖它上面最终的积水高度是如何求的,我们需要找到它左右两边的最高的砖块,而它最终的高度就是这两个砖块中较矮的那个。所有我们需要先遍历来得到每个砖块左右最高砖块的高度,最后根据这两个高度来确定最终的高度。下面的代码先从后往前遍历得到右边的最高高度,然后从前往后遍历得到左边的最高高度,同时得到两者中小的一个加入总和。

AC源码

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if not height:
            return 0
        length = len(height)
        maxh = [0 for __ in range(length)]
        h = height[length - 1]
        for i in range(length - 2, -1, -1):
            maxh[i] = h
            h = max(h, height[i])

        h = height[0]
        result = 0
        for i in range(1, length - 1):
            h = max(h, height[i])
            result += max(0, min(h, maxh[i]) - height[i])
        return result


if __name__ == "__main__":
    assert Solution().trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]) == 6

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值