方法:双指针

  • step 1:检查数组是否为空的特殊情况
  • step 2:准备双指针,分别指向数组首尾元素,代表最初的两个边界
  • step 3:指针往中间遍历,遇到更低柱子就是底,用较短的边界减去底就是这一列的接水量,遇到更高的柱子就是新的边界,更新边界大小。

时间复杂度:o(n)

空间复杂度:o(1)

class Solution {
  public:
    long long maxWater(vector<int>& arr) {
        // 特殊情况处理
        if (arr.size() == 0)
            return 0;

        long long res = 0;
        int left = 0;
        int right = arr.size() - 1;

        int maxL = 0;
        int maxR = 0;

        while (left < right) {
            maxL = max(maxL, arr[left]);
            maxR = max(maxR, arr[right]);

            if (maxL < maxR)
                res += (maxL - arr[left++]);
            else
                res += (maxR - arr[right--]);
        }

        return res;
    }
};