题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
思路:这道题我的思路是使用单调栈来进行求解,栈中存放的是墙的下标。当current指向的墙比当前栈顶的墙低时,说明可以存水,即压入栈;如果比当前栈顶的墙高,则栈中元素进行弹出,并计算积攒的雨水量。先判断左右墙的高度,取最低的:
//确定左右最低高度
int min = Math.min(height[stack.peek()],height[current]);
同时,需要计算下两个墙之间的距离:
//计算距离
int distance = current - stack.peek()-1;
所以当前的积水就等于:最低墙的高度减去上次弹出墙的高度:
sum = sum + distance*(min-h);
代码:
class Solution {
public int trap(int[] height) {
int sum = 0;//用来计算积水
Stack<Integer> stack = new Stack<>();//存的是下标
int current = 0;
while(current < height.length){
//当栈不为空,且值比栈顶大时,需要执行弹出和计算积水
while(!stack.isEmpty() && height[current] >height[stack.peek()]){
int h = height[stack.pop()];//计算弹出的元素高度
//stack.pop();
if(stack.isEmpty()){
break;//如果为空,直接跳出
}
//计算距离
int distance = current - stack.peek()-1;
//确定左右最低高度
int min = Math.min(height[stack.peek()],height[current]);
sum = sum + distance*(min-h);
}
stack.push(current);
current++;
}
return sum;
}
}