题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
思路
先找出每个位置做左边最高长度,再找出每个节点的右边的最高高度,然后,每次取当前位置的左边最高节点和右边最高节点中小的那个减去当前节点的高度,得到的就是当前位置能够容纳的雨水。再累积起来所有和即可!
代码
class Solution {
public int trap(int[] height) {
int length=height.length;
if(length==0)
return 0;
// 找出当前节点的左边最高高度
int leftMax[]=new int[length];
leftMax[0]=height[0];
for(int i=1;i<length;++i)
{
leftMax[i]=Math.max(leftMax[i-1],height[i]);
}
// 找出当前节点的右边最高高度
int rightMax[]=new int[length];
rightMax[length-1]=height[length-1];
for(int i=length-2;i>=0;--i)
{
rightMax[i]=Math.max(rightMax[i+1],height[i]);
}
// 累积起每个位置的雨水即可
int ans = 0;
for (int i=0;i<length;++i) {
ans+=Math.min(leftMax[i],rightMax[i])-height[i];
}
return ans;
}
}