给定 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;
}
本文介绍了一种计算由柱状图表示的高度图在雨后能接多少雨水的方法。通过找出最高柱子的索引,从左至右及从右至左遍历,更新左右最高值,计算雨水量。示例中,数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图可以接6单位雨水。
833

被折叠的 条评论
为什么被折叠?



