LeetCode: Trapping Rain Water

思路:

从当前位置pos的柱子开始,搜索后面的柱子A[k],k = pos+1,...,n,A[k]有两种情况:

1)A[k] >= A[pos],且k - pos > 1,此时组成一个“桶”,注意:此时他们的桶底是中间(pos 到 k中间)高度最高的柱子,桶底与这根柱子顶部平行,在这种情况下,就不用往后搜索了,因为A[k]阻止了A[pos]与后面的柱子形成通;

2) A[k] < A[pos],只要 k - pos >1,而且中间位置(pos 到 k)的最高的柱子不超过A[k],也能形成一个桶,当然这个情况下,还是向后搜索,因为此时A[k]不能阻止A[pos]与后面的柱子形成“桶”。

注意中间位置的高度的记录,每次保留已经搜索的最大值。

整个时间复杂度为O(n^2)。这个题有O(n)个解法,以后再来^_^.

code:

class Solution {
public:
    int trap(int A[], int n) {
        if(n<=1)return 0;
        int sum = 0, midHeigh;
        for(int i=0;i<n;i++){
            midHeigh = 0;
            for(int j=i+1;j<n;j++){
                if(A[j] >= A[i]){  //第一种形成“桶”情况
                    sum += ((A[i] - midHeigh)*(j-1-i));
                    break;
                }
                else{ //第二种形成“桶”情况
                    if(A[j] > 0 && midHeigh < A[j])
                        sum += (A[j] - midHeigh)*(j-1-i);
                    midHeigh = max(midHeigh,A[j]);  //更新中间位置的柱子的最高高度
                }
            }
        }
        return sum;
    }
};


你可能感兴趣的:(LeetCode: Trapping Rain Water)