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.
Trapping Rain Water

Example
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
Challenge
O(n) time and O(1) memory
O(n) time and O(n) memory is also acceptable.
Thoughts
这一道题属于2 pointer的题 通过观察我们可以发现,根据木桶原理,两个boundary中间能灌的水是取决于两边较小的值 通过可以灌到多少高度来求得水的体积是多少
设左右两个指针,从0和len(A)-1开始,从较小的一边往内部灌水
while loop, 当两个指针相遇时结束
- 如果小于boundary高度,计算能灌的水量
 - 如果高于boundary的高度,更新这一边的boundary
 
Solution
class Solution:
    # @param heights: a list of integers
    # @return: a integer
    def trapRainWater(self, heights):
        # write your code here
        if not heights:
            return 0
        p1 = 0
        p2 = len(heights) - 1
        leftBound = heights[p1]
        rightBound = heights[p2]
        result = 0
        while p1 < p2:
            if leftBound <= rightBound:
                p1 += 1
                if heights[p1] <= leftBound:
                    result += leftBound - heights[p1]
                else:
                    leftBound = heights[p1]
            else:
                p2 -= 1
                if heights[p2] < rightBound:
                    result += rightBound - heights[p2]
                else:
                    rightBound = heights[p2]
        return result