题目:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
题解:
class Solution {
public int trap(int[] height) {
int len=height.length;
if(len==0){
return 0;
}
int res=0;
//当前i位置左边高度的最大值
int[] leftMax=new int[len];
//当前i位置右边高度的最大值
int[] rightMax=new int[len];
leftMax[0]=height[0];
//一开始这个地方脑子没有转过来圈,想着对于每一个height[i],
//求它左边的最大值都要都往遍历一次,这样时间复杂度就是O(n*n)
//看了大神的解答之后,感觉就是利用冒泡排序里面的思想,
//逆序来求最大值,遍历一遍就可以了
for(int i=1;i<len;i++){
leftMax[i]=Math.max(height[i],leftMax[i-1]);
}
rightMax[len-1]=height[len-1];
for(int i=len-2;i>=0;i--){
rightMax[i]=Math.max(height[i],rightMax[i+1]);
}
for(int i=0;i<len;i++){
res+=Math.min(leftMax[i],rightMax[i])-height[i];
}
return res;
}
}