Trapping Rain Water

Question

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.

For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

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!

Tags

  • Array
  • Two Pointers

Thought

Use the Two pointers and looping the whole array from two sides.

Code

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if len(height) == 0:
            return 0
        maxHeight = max(height)
        left = 0
        right = len(height) - 1
        currentHeight = 0
        water = 0
        while height[left] < maxHeight:
            if height[left] > currentHeight:
                currentHeight = height[left]
            else:
                water += currentHeight - height[left]
            left += 1
        currentHeight = 0
        while height[right] < maxHeight:
            if height[right] > currentHeight:
                currentHeight = height[right]
            else:
                water += currentHeight - height[right]
            right -= 1
        if left == right:
            return water
        for i in xrange(left, right):
            water += maxHeight - height[i]
        return water

results matching ""

    No results matching ""