public int trap(int[] height) {
Deque<Integer> stack = new LinkedList<>();
int n = height.length;
int ans = 0;
for (int i = 0; i < n; i++) {
while(!stack.isEmpty() && height[i]>height[stack.peek()]){
int low = stack.pop();//把最低端的弹出来,此时的栈顶是左边界
if(stack.isEmpty()){//如果没有左边界,跳出while
break;
}
int left = stack.peek();
int w = i-left-1;
int h = Math.min(height[left],height[i]) - height[low];
ans+=(w*h);
}
stack.push(i);
}
return ans;
}
栈里面维护的是接雨水区间的左边界,如果左边界一直减少,那么就一直加入到栈中(不走while)
当遇到第一个增加的时候,通过left 底部 当前三者的关系,计算出ans。