双指针法:除了第一列与最后一列不接雨水,计算其他每一列能接到的雨水,第i列能接到的雨水=min(i左边的最高值,i右边的最高值) – 第i列本身的高度。O(n^2)可能会超时。

动态规划:递推的计算两个数组,left_max保存左边最高的高度,right_max保存右边最高的高度。第i列能接到的雨水=min(left_max[i], right_max[i]) – height[i]。一下为动态规划代码。

class Solution {
public:
    /**
     * max water
     * @param arr int整型vector the array
     * @return long长整型
     */
    long long maxWater(vector<int>& arr) {
        if(arr.size()<=2) return 0;
        int n=arr.size();
        vector<int> left_max(n,0);
        left_max[0]=arr[0];
        for(int i=1;i<n;i++) left_max[i]=max(arr[i],left_max[i-1]);
        vector<int> right_max(n,0);
        right_max[n-1]=arr[n-1];
        for(int i=n-2;i>=0;i--) right_max[i]=max(arr[i],right_max[i+1]);
        long long sum=0;
        for(int i=0;i<n;i++){
            int h=min(left_max[i],right_max[i])-arr[i];
            if(h>0) sum+=h;
        }
        return sum;
    }
};