接雨水

抽象模型:两侧木板可以调节高度的木桶 能存多少水,取决于两侧木板的高度。碰撞指针,维护maxL和maxR表示两侧木板高度。 以指针l来说,当前它的位置左侧的maxL是可信的,它右侧的maxR未必是最大(想象输入样例的情况,两侧木板中间***一根更长的木板,把一个木桶分成了两个木桶)。但是这并不影响当前位置的储水量。 假设maxL < maxR,那么不管maxR是否准确,当前位置能存储的水量都是maxL - arr[l]. 若maxL > maxR,同理,右侧部分是可信的。

class Solution {
public:
    /**
     * max water
     * @param arr int整型vector the array
     * @return long长整型
     */
    long long maxWater(vector<int>& arr) {
        // write code here
        int n =  arr.size();
        if(n == 0)
            return 0;
        long res = 0;
        int l = 0;
        int r = n - 1;
        int maxL = 0;
        int maxR = 0;
        while( l < r ){
          	//碰撞指针每次移动,都要维护两侧木板高度
            maxL = max(maxL,arr[l]);
            maxR = max(maxR,arr[r]);
          	//判断左右木板谁可信
            if(maxL < maxR)
                res += maxL - arr[l++];
            else
                res += maxR - arr[r--];
        }
        return res;
    }
};