42. Trapping Rain Water

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.

Solution: Two Pointers

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        rain = 0
        low = 0
        high = len(height) - 1
        while low < high:
            if height[low] < height[high]:
                wall = height[low]
                for idx in xrange(low + 1, high + 1):
                    if height[idx] >= wall:
                        low = idx
                        break
                    rain += wall - height[idx]
            else:
                wall = height[high]
                for idx in xrange(high - 1, low - 1, -1):
                    if height[idx] >= wall:
                        high = idx
                        break
                    rain += wall - height[idx]
        return rain

Lessons:

  • Two pointers. Pick the pointer with smaller height.

results matching ""

    No results matching ""