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