Trapping Rain Water

扫描多遍, 从做至右求每根柱子 左最大值, 从右至左扫一遍 求右最大值.

最左边柱子maxleft=0,最右边的柱子maxRight=0

// Trapping Rain Water
// 思路1,时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
    int trap(const vector<int>& A) {
        const int n = A.size();
        //int *left_peak = new int[n]();
        //int *right_peak = new int[n]();
        vector<int> left_peak(n, 0);
        vector<int> right_peak(n, 0);

        for (int i = 1; i < n; i++) {
            left_peak[i] = max(left_peak[i - 1], A[i - 1]);
            right_peak[n-1-i] = max(right_peak[n-i], A[n-i]);
        }

        // for (int i = n - 2; i >=0; --i) {
        //     right_peak[i] = max(right_peak[i+1], A[i+1]);
        // }

        int sum = 0;
        for (int i = 0; i < n; i++) {
            int height = min(left_peak[i], right_peak[i]);
            if (height > A[i]) {
                sum += height - A[i];
            }
        }

        return sum;
    }
};

1

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
left_peak: [0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]

results matching ""

    No results matching ""