给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
这里用到了单调递减栈,
遍历数组
入栈:
如果栈是空的,直接把当前遍历位置存到栈中,如果遍历位置的高度小于栈首元素,这就表示没有形成一个低洼,没法存雨水,所以也把位置存到栈中,
出栈:
如果遍历位置的高度大于栈首,表示找到了一个比较高的位置,因为是递减栈,所以和当前栈首上一个位置的高度形成了低洼,这个低洼容量的高度就是用低洼两边比较低的高度减掉这个高度stack.pop(),把这个乘以两边高地距离就是当前低洼面积
class Solution {
public int trap(int[] height) {
Stack<Integer> s = new Stack();
int sum = 0;
for(int i=0;i<height.length;i++){
while(!s.isEmpty()&&height[s.peek()]<height[i]){
int ss = s.pop();
if(s.isEmpty()){
break;
}
sum+=(i-s.peek()-1)*(Math.min(height[i],height[s.peek()])-height[ss]);
}
s.push(i);
}
return sum;
}
}