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!
class TrappRainWater
{
public:
int trap(int A[], int n) {
if(n==0) return 0;
int *leftMaxArray = new int[n];
int *rightMaxArray = new int[n];
leftMaxArray[0] = 0;
rightMaxArray[n-1] = 0;
int max = A[0];
for(int i=1;i<n;i++)
{
leftMaxArray[i] = max;
max = max<A[i]?A[i]:max;
}
max = A[n-1];
for(int i=n-2;i>=0;i--)
{
rightMaxArray[i] = max;
max = max<A[i]?A[i]:max;
}
int ret = 0;
for(int i=0;i<n;i++)
{
int smallValue = leftMaxArray[i]<rightMaxArray[i]?leftMaxArray[i]:rightMaxArray[i];
if(smallValue>A[i])
ret+=(smallValue-A[i]);
}
return ret;
}
};