方法:双指针
- 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; } };