题目:
分析:先分析题目,要能装雨水那么就要有凹槽,有凹槽也就两边要有高度差,最大装水取决于较小高度的柱子,但凹槽不一定是规则的形状,那么可以这么想,求每个位置(柱子)当前对应上方可装多少水,最后加起来就是总的装水量。每个位置(柱子)当前对应上方可装多少水取决于左右柱子的高度比当前柱子高度高多少并受限于左右两边高度较小的柱子,那么可以求每个位置上左右两边高度最大的柱子是多高取较小者减去当前柱子高度即当前柱子上方可装多少水。
要求每个柱子左右的最高柱子想到可以用动态规划的思想或者每次都从该位置都分别去左右寻找最大高度,这里我使用动态规划的方法,减少循环的次数
代码
class Solution {
public int trap(int[] height) {
if(height == null || height.length == 0){
return 0;
}
//左边最大高度数组
int[] maxLeft = new int[height.length];
//右边最大高度数组
int[] maxRight = new int[height.length];
int left = 0;
int right = height.length - 1;
int result = 0;
//注意下面两个要赋初始值
maxLeft[0] = height[0];
maxRight[height.length - 1] = height[height.length - 1];
for(int i = 1; i < height.length; i++){
maxLeft[i] = Math.max(maxLeft[i - 1], height[i]);
}
for(int i = height.length - 2; i >= 0; i--){
maxRight[i] = Math.max(maxRight[i + 1], height[i]);
}
for(int i = 0; i < height.length; i++){
result += Math.min(maxLeft[i], maxRight[i]) - height[i];
}
return result;
}
}