class Solution {
    //下标i处能接的雨水为左右两边的最大值里的最小值- height[i]
    // 这里可以用双指针的思想 时间复杂度O(n),空间复杂度O(1)
    // 动态规划更直接, 用两个数组记录左右两边的最大值 时间复杂度O(n),空间复杂度O(1)
    public int trap(int[] height) {
        int n = height.length;
        // int[] leftMax = new int[n];
        // int[] rightMax = new int[n];
        // leftMax[0] = height[0];
        // rightMax[n - 1] = height[n - 1];
        // for (int i = 1; i < n; i++) {
        //     leftMax[i] = Math.max(leftMax[i-1], height[i]);
        // }
        // for (int i = n - 2; i >= 0; i--) {
        //     rightMax[i] = Math.max(rightMax[i + 1], height[i]);
        // }
        // int sum = 0;
        // for (int i = 0; i < n; i++) {
        //     sum += Math.min(leftMax[i], rightMax[i]) - height[i];
        // }
        // return sum;
        int leftMax = 0, rightMax = 0;
        int left = 0,right = n - 1, sum = 0;
        while (left <= right) {
            leftMax = Math.max(height[left], leftMax);
            rightMax = Math.max(height[right], rightMax);
            if (leftMax < rightMax) {
                sum += leftMax - height[left];
                left++;
            } else {
                sum += rightMax - height[right];
                right--;
            }
        }
        return sum;
    }
}