给定 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
法一 动态编程
找出最高的柱子的索引值。这个索引值用作后面从左往右遍历至最高的柱子,然后再从右往左遍历一遍。
遍历过程中,找到除最高的柱子外,不停更新左边最高的柱子的值。只要比当前左最高值的低的柱子都能接雨水,雨水量是二者的高度差,继续遍历;如果高度高于当前的左最高值,更新左最高值,继续遍历。
右边同理。
成功
执行用时 : 4 ms, 在Trapping Rain Water的Java提交中击败了64.00% 的用户
内存消耗 : 35.6 MB, 在Trapping Rain Water的Java提交中击败了98.34% 的用户
class Solution {
public int trap(int[] height) {
//暴力法
if(height.length==0 || height.length==1 )
return 0;
//找出所有柱子中最高的那一个的索引值
int max = height[0];
int maxi = 0;
for(int i=1; i<height.length; i++){
if(height[i] > max){
max = height[i];
maxi = i;
}
}
int res = 0;
int lmax = 0;
//从左往右遍历至最高的柱子
for(int i=0; i<maxi; i++){
if(height[i] < lmax)
res += (lmax-height[i]);
else if(height[i] > lmax)
lmax = height[i];
}
int rmax = 0;
//从右往左遍历至最高的柱子
for(int i=height.length-1; i>maxi; i--){
if(height[i] < rmax)
res += (rmax-height[i]);
else if(height[i] > rmax)
rmax = height[i];
}
return res;
}