题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [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
思路
这里借用官方思路,假设右边界无限高,容易求得这种情况下的最大装水量,再假设左边界无限高,同样容易求得左边界情况下的最大装水量,事实上,这两种情况的交集,就是总的装水量,借用官方的思路图解;
代码
public class Solution {
public int trap(int[] height) {
if (height.length == 0)
return 0;
int len = height.length, ans = 0;
int[] leftMax = new int[len], rightMax = new int[len];
leftMax[0] = height[0];
for (int i=1; i<len; i++)
leftMax[i] = Math.max(leftMax[i-1], height[i]);
rightMax[len-1] = height[len-1];
for (int i=len-2; i>=0; i--)
rightMax[i] = Math.max(rightMax[i+1], height[i]);
for (int i=0; i<len; i++)
ans += Math.min(leftMax[i], rightMax[i]) - height[i];
return ans;
}
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {0,1,0,2,1,0,1,3,2,1,2,1};
System.out.println(solution.trap(nums));
}
}