class Solution {
public int trap(int[] height) {
Deque<Integer> stack = new LinkedList<Integer>();
int water=0;
for(int i=0;i<height.length;i++){
int cur = height[i];
while(stack.isEmpty()==false&&cur>height[stack.peek()]){
int top = stack.pop();
if(stack.isEmpty())break;
int left = stack.peek();
//宽度计算的是两个中间的宽度,相邻的为0
int currWidth = i - left - 1;
//高度为弹出去的上一个和当前左边的差值
int currHeight = Math.min(height[left], height[i]) - height[top];
water += currWidth*currHeight;
}
stack.push(i);
}
return water;
}
}
解析:
分层计算
维护一个单调栈,单调栈存储的是下标,满足从栈底到栈顶的下标对应的数组 height 中的元素递减。
从左到右遍历数组,遍历到下标 i 时,发现不满足单调递减。这时候要保证栈内有两个元素,一个作为中间的间隔标识,一个作为左边的支点。这时候先弹出来一个,然后记录下一个栈顶。这时候可以接的雨水为长*宽(左右两端的距离×左边支点和右边支点最小值和弹出来节点的差)。