题目如下:
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
解答如下:
大致思路是:从i=1开始遍历height数组,直到倒数第二个结束,判断在索引i处,是否要填充水,填充多少水。判断的依据为:
- 0~i区间,height数组最大值为left_max
- i ~ height.length-1 区间,height数组最大值为right_max
- 如果 height[i]>=left_max || height[i]>=right_max 则不填充水,否则填充 Math.min(left_max,right_max)-height[i] 。
Java代码如下:
class Solution {
public int trap(int[] height) {
if(height.length<=2) return 0;
int[] max1=new int[height.length];
int[] max2=new int[height.length];
max1[0]=height[0];
for(int i=1;i<height.length;i++){
max1[i]=max1[i-1]>=height[i]?max1[i-1]:height[i];
}
max2[0]=height[height.length-1];
for(int i=height.length-2;i>=0;i--){
max2[height.length-1-i]=max2[height.length-1-i-1]>=height[i]?max2[height.length-2-i]:height[i];
}
int ans=0;
for(int i=1;i<height.length-1;i++){
int left=max1[i];
int right=max2[height.length-i-1];
if(height[i]>=left||height[i]>=right) continue;
else{
int min=left<=right?left:right;
ans=ans+min-height[i];
}
}
return ans;
}
}