LeetCode-Python-42. 接雨水

  • Post author:
  • Post category:python


给定

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

思路:

每个位置上积水的高度,应该等于min(左边最高的柱子高度,右边最高的柱子高度) –  这个位置上的柱子高度。

所以先从左往右遍历把left_max数组生成,left_max[i]代表 height[i] 及其左侧最高的柱子高度。

同理生成right_max。

然后再遍历一次对于每个位置计算min(left_max[i], right_max[i]) – height[i]就好了

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        left_max = [0 for _ in height]
        right_max = [0 for _ in height]
        water = [0 for _ in height]
        
        for i in range(len(height)):
            if i - 1 >= 0:
                left_max[i] = max(left_max[i - 1], height[i])
            else:
                left_max[i] = height[i]
            
        for i in range(len(height) - 1, -1, -1):
            if i  < len(height) - 1:
                right_max[i] = max(right_max[i + 1], height[i])
            else:
                right_max[i] = height[i]
                
        for i in range(len(height)):
            tmp = min(left_max[i], right_max[i]) - height[i]
            if tmp > 0:
                water[i] = tmp
        # print height     
        # print water
        # print left_max
        # print right_max
        return sum(water)



版权声明:本文为qq_32424059原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。