题目:
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
.
一开始我以为只用找出所有的极大值,然后在没两个极大值的区间里把水的体积计算出来即可。对于上图给出的样例,可以通过,但是对于[5,2,1,2,1,5]这种洼地,容积取决于最高的挡板,所以这种思路有问题。
正确的思路是找出最高的那一块挡板,下标即为maxindex,然后分别从左和右逼近maxindex,在逼近的过程中计算水的容积
以左边逼近为例:
1、若遍历的挡板高度A[left]小于之前挡板的最大高度A[maxleft],则它可以装水,装的水量为A[maxleft]-A[left];
2、若遍历到的挡板高度A[left]大于或等于之前的最大高度,则更新maxleft 为left
注意:这样每一个maxleft其实并非所有的极大值点~
右边逼近与左边类似,代码如下:
public class No41_TrappingRainWater {
public static void main(String[] args){
System.out.println(trap(new int[]{5,2,1,2,1,5}));
}
public static int trap(int[] A) {
if(A.length < 3) return 0;
int maxindex = 0;
for(int i=0;i<A.length;i++){
if(A[i] > A[maxindex])
maxindex = i;
}
int ret = 0;
int maxleft = 0;
for(int left=0;left<maxindex;left++){
if(A[left]<A[maxleft])
ret += A[maxleft] - A[left];
else
maxleft = left;
}
int maxright = A.length-1;
for(int right=A.length-1;right>maxindex;right--){
if(A[right]<A[maxright])
ret += A[maxright] - A[right];
else
maxright = right;
}
return ret;
}
}