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!
two pass:
class Solution {
public:
int trap(vector<int>& h) {
int n = h.size(), L = 0, R = 0;
if(n == 0) return 0;
int res = 0, maxh = 0, maxi;
for(int i = 0; i < n; i++){
maxh = max(maxh, h[i]);
}
while(h[R] < maxh){
while(h[R] <= h[L] && R < n){
res += h[L] - h[R];
R++;
}
L = R;
}
maxi = R;
L = R = n - 1;
while(h[L] <= maxh && L >= maxi){
while(h[L] <= h[R] && L >= maxi){
res += h[R] -h[L];
L--;
}
R = L;
}
return res;
}
};
one pass:
class Solution {
public:
int trap(int A[], int n) {
int left=0; int right=n-1;
int res=0;
int maxleft=0, maxright=0;
while(left<=right){
if(A[left]<=A[right]){
if(A[left]>=maxleft) maxleft=A[left];
else res+=maxleft-A[left];
left++;
}
else{
if(A[right]>=maxright) maxright= A[right];
else res+=maxright-A[right];
right--;
}
}
return res;
}
};