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!
题目解析:
让求得其中能装多少水。
仔细分析,就分两种情况:
1、找到其实大于0的数据当成起始柱子
2、如果右边有比它高的柱子,那么就遍历截止,算二者之间装水的体积。
3、如果右边没有比它高的柱子,就找到右边最大的的那个柱子,然后算二者之间装水的体积(不用管是否挨着,比如7和8是挨着的)
class Solution {
public:
int trap(int A[], int n) {
int sum = 0;
for(int i = 0;i < n;i++){ //从头到为遍历
if(A[i]!=0){ //找到第一个不为0的数
int base = i;
int hi = findhi(A,base,n); //找到比A[base]大的,或者其之后最大的值
sum += Area(A,base,hi); //求面积和
i = hi-1; //由于for最后有个i++,所以这里要减去一下。
}
}
return sum;
}
int findhi(int A[],int k,int n){
int index = k+1;
for(int i = k+1;i < n;i++){
if(A[i] > A[k]){ //如果找到了一个比起始数据大的,就返回这个
return i;
}
if(A[i] > A[index]) //返回比起始数据小的数据中的最大值
index = i;
}
return index;
}
int Area(int A[],int lo,int hi){
int sum = 0;
int min = A[hi]>A[lo]?A[lo]:A[hi]; //面积是最短的高度乘以距离
sum = min*(hi - lo - 1);
for(int i = lo+1;i<hi;i++){ //减去那些柱子占据的空间
sum -= A[i];
}
return sum;
}
};