LeetCode | Trapping Rain Water(柱子间存储的水容量)


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.

《LeetCode | Trapping Rain Water(柱子间存储的水容量)》

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;
    }
};

点赞