publicinttrap(int[] height){int len = height.length;int[] left =newint[len];int[] right =newint[len];
left[0]= height[0];
right[len -1]= height[len -1];for(int i =1; i < len; i++){
left[i]=Math.max(left[i -1], height[i]);}for(int i = len -2; i >=0; i--){
right[i]=Math.max(height[i], right[i +1]);}int result =0;for(int i =0; i < len; i++){
result +=Math.min(left[i], right[i])- height[i];}return result;}
publicinttrap(int[] height){int ans =0;Deque<Integer> stack =newLinkedList<Integer>();int n = height.length;for(int i =0; i < n;++i){/**
这里的思路是当前位置大于栈顶元素,但是我们要去寻找的是一个低洼,所以要把栈顶元素pop,
pop以后的栈顶元素和当前height[i]的元素一起形成一个低洼,那么刚才pop出去的位置
可以接的雨水的数量是两边的最小值-pop出去的位置的值,然后乘上宽度i - left - 1。
*/while(!stack.isEmpty()&& height[i]> height[stack.peek()]){int top = stack.pop();if(stack.isEmpty()){break;}int left = stack.peek();int currWidth = i - left -1;int currHeight =Math.min(height[left], height[i])- height[top];
ans += currWidth * currHeight;}
stack.push(i);}return ans;}