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!
int trap(int arr[], int n)
{
if (arr == NULL || n <= 0)
{
return 0;
}
int ans = 0;
int *a = new int[n];
memset(a, 0, sizeof(int) * n);
int *b = new int[n];
memset(b, 0, sizeof(int) * n);
int left = arr[0];
int right = arr[n - 1];
for (int i = 1, j = n - 2; i < n; ++i, --j)
{
a[i] = left;
left = max(left, arr[i]);
b[j] = right;
right = max(right, arr[j]);
}
for (int i = 1; i < n - 1; ++i)
{
int high = min(a[i], b[i]);
if (arr[i] < high)
{
ans += (high - arr[i]);
}
}
delete []a;
delete []b;
return ans;
}