双指针典型

class Solution {
public:
    /**
     * max water
     * @param arr int整型vector the array
     * @return long长整型
     */
    long long maxWater(vector<int>& arr) {
      if (arr.empty()) {
        return 0;
      }
      
      long long res = 0;
      int left = 0, right = arr.size() - 1;
      //  底边左右的最高柱子,形成凹形
      int max_l = 0, max_r = 0;
      
      while (left < right) {
        //  两个最高的边界柱子,始终包含或等于当前的柱子
        //  其与当前柱子高度差为容纳的水量
        max_l = std::max(max_l, arr[left]);
        max_r = std::max(max_r, arr[right]);
        
        //  选取短边
        if (max_l < max_r) {
          res += max_l - arr[left++];
        } else {
          res += max_r - arr[right--];
        }
      }
      
      return res;
    }
};