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!
public class Solution {
public int trap(int[] A) {
Stack<Integer> pre = new Stack<Integer>();
int result = 0;
for(int i = 0; i < A.length; i++) {
if(pre.isEmpty() || A[pre.peek()] > A[i]) {
pre.push(i);
continue;
}
int mid = pre.pop();
if(pre.isEmpty()) pre.push(i);
else {
int left = pre.peek();
result += (Math.min(A[left], A[i])-A[mid]) * (i-left-1);
i--;
}
}
return result;
}
}