思路:
先判断 最左最右哪边高,如果右边高于左边则 先执行 左边的循环,
left_max用来记 当前柱子height[i] 与左边最大的值left_max比较(因为左边小于右边,所以只有小于左边,才能存储水),且存储的水量为 left_max 和当前柱 height[i]的差值。
同理,当遍历到有一个柱的高度高于右边,就将该柱当最高,然后开始从右往左遍历,这里遍历的是比右边小的 height[right] (与左边的同理,只有这样才能存储水,因为这时,左边最高,以左最大left_max和右最大right_max作为桶,当前的柱高度作为厚度,那么存储的水量自然就是与右最大right_max的差值)

 public long maxWater (int[] arr) {
            //双指针 ,分别为左、右、左最大、右最大,返回值ans
        int left=0,right=arr.length-1,
            left_max=0,right_max=0;
                long ans=0L;

        //循环
        while(left<right){  //当 left=right时,此时表示的是同一个柱子,循环则结束
            if(arr[left]<arr[right]){   //判断左边高还是右边高,如果右边高进入下面的if判断
                if(arr[left]>left_max){    //进入到这里,是右边高于左边,如果柱子高度大于左边最大left_max则存不了水,就存当前为最大,进入下一次if判断(这里有left++)
                    left_max=arr[left];    //左边最大置于 目前所处的arr[left]
                }else{    //如果小于左边最大left_max,这时符合桶的含义,可以存储水量,但这时左边最高left_max<右边最高right_max
                    ans+=left_max-arr[left];  //这里已经确定了左边的最大值小于右边的right
                }
                left++;    //进行下一次判断

            //与上面同理
            }else{
                if(arr[right]>right_max){
                    right_max=arr[right];
                }else{
                    ans+=right_max-arr[right];
                }
            right--;
            }
        }
            return ans;

    }