给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
维护一个单调不增栈
class Solution {
public int trap(int[] height) {
int n=height.length;
Deque<Integer> stack=new ArrayDeque<>();
int res=0;
int curIndex=0;
while(curIndex<n){
while(!stack.isEmpty() && height[curIndex]>
height[stack.peek()]){
int top=stack.pop();//top即凹槽
if(stack.isEmpty()) break;
int h=Math.min(height[stack.peek()],height[curIndex])-height[top];//凹槽两侧高度取小减去凹槽高度
int dist=curIndex-stack.peek()-1;//注意减去柱子本身的宽度1
res+=dist*h;
}
stack.push(curIndex++);
}
return res;
}
}