给定 n 个非负整数表示每个宽度为 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 个单位的雨水(蓝色部分表示雨水)
解决方案(自):
一行一行的计算能接雨水的有效位置:
第一行:10110111111
第二行:100011010
计算0的个数就可以了。
可以是可以,但在最后第318个例子中超出时间的限制,官网给的示例数据特别凶残。
public int trap(int[] height){
//获取数组的最大值,最大值决定了要遍历的次数
int max = 0;
for (int i = 0; i < height.length; i++) {
max = Math.max(max, height[i]);
}
//for循环遍历
int index = 0;//用于记录
for (int i = 0; i < max; i++) {
Stack<Integer> stack = new Stack();
//获取每一层的数字,并清除前面的0
for (int j = 0; j < height.length; j++) {
//清除前面的0。如果栈空,此时值为0,不进栈
if (stack.empty()&&height[j]==0) {
continue;
}else if (height[j]>0) {
//大于0的数值记作1
stack.push(1);
height[j] = height[j]-1;
}else {
//除了开头的0,后面其他0还是记作0
stack.push(0);
}
}
//将尾部的0也清除掉
while(stack.peek()==0){
stack.pop();
}
//获取中间的0,也就是雨水
while(!stack.empty()){
if (stack.peek()==0) {
index++;
}
stack.pop();
}
}
//System.out.println(index);
return index;
}