定义四个变量:
leftMax表示arr[0..L-1]中的最大值
L表示位于左侧的指针变量,初始值为1
rightMax表示arr[L+1..N-1]中的最大值
R表示位于右侧的指针变量,初始值为N-2

求解容器中水容量的每一步就是R向左或者L向右进行移动,其中具体的逻辑是:
1、如果leftMax<=rightMax,那么可以求出L位置上的水量,为Max{leftMax-arr[L],0},然后L向右移动,移动之前要更新leftMax,leftMax = Max{leftMax,arr[L++]}
2、如果leftMax>rightMax,那么同样的道理,可以求出R位置上的水量Max{rightMax-arr[R],0},R向右移动的时候,也要更新rightMax(rightMax=Max{rightMax,arr[R--]})。

leftMax能够保证是arr[0..L-1]中的最大值,限定了L左侧的界限
rightMax能够保证是arr[R+1..N-1]中的最大值,限定了R右侧的界限

只要leftMax<=rightMax或者leftMax>rightMax的情况确定,无论未探索的中间区域是否有更大的值,都能计算出当前位置处的水量,因为一个位置处的水量的多少是由其左右两侧的值同时决定的。

    public long maxWater (int[] arr) {
        if (arr == null || arr.length < 3){
            return 0;
        }

        long res = 0;
        int leftMax = arr[0];
        int rightMax = arr[arr.length-1];
        int L = 1;
        int R = arr.length - 2;

        while (L <= R){

            if (leftMax <= rightMax){
                res += Math.max(0,leftMax - arr[L]);
                leftMax = Math.max(leftMax,arr[L++]);
            }else {

                res += Math.max(0,rightMax - arr[R]);
                rightMax = Math.max(rightMax,arr[R--]);
            }
        }


        return res;
    }