LeetCode #42: Trapping Rain Water

Oscar

May 22, 2020 11:32 Technology

This is a classic LeetCode hard question.

Description:

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.


The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

Solution:

  • Traverse the array left-to-right and right-to-left to get the cumulative maximum, then the difference between the minima of them and the array is the volume of trapped rain.
  • Time complexity: O(3N)
  • Space complexity: O(2N)
class Solution:
    def trap(self, height: List[int]) -> int:
        n = len(height)
        rain = 0
        if n > 0:
            mleft = [0 for i in range(n)]
            mleft[0] = height[0]
            for i in range(1, n):
                mleft[i] = max(mleft[i-1], height[i])

            mright = [0 for i in range(n)]
            mright[n-1] = height[n-1]
            for i in range(n-2, -1, -1):
                mright[i] = max(mright[i+1], height[i])

            for i in range(n):
                rain += min(mleft[i], mright[i]) - height[i]

        return rain

 

Share this blog to:

718 views,
0 likes, 0 comments

Login to comment