双指针典型
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;
}
};