给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水?
题目分析:
一:
二:
三:
我们可以使用动态规划去实现
class Solution {
public int trap(int[] height) {
/**
* 求取存储雨水量,也就是获取每列上方存储雨水数量
* 针对与当前列,只有左右两边的柱子都高于当前列,当前列的上方才能储存水
* 当前列能存储的水 等于两边的最小值减去当前列的值,有落差才能存雨水
* 需要找到当前列左右两边最高柱子高度
*/
int sum=0;
//左边柱子高度
int[] leftH=new int[height.length];
//右边柱子高度
int[] rightH=new int[height.length];
for(int i=1;i<height.length;i++) {
leftH[i]=Math.max(leftH[i-1], height[i-1]);
}
for (int i = height.length - 2; i >= 0; i--) {
rightH[i]=Math.max(rightH[i+1], height[i+1]);
}
//第一个和倒数第一个是存储不了水的
for(int i=1;i<height.length-1;i++) {
//获取柱子两边的最小值
int minH=Math.min(leftH[i],rightH[i]);
//最小值需要大于当前柱子才能存储水
if(minH>height[i]) {
sum=sum+(minH-height[i]);
}
}
return sum;
}
}