class Solution {
public:
long long maxWater(vector<int>& arr) {
if(arr.size() <= 2) return 0;
long long res = 0;
int left_heigest[arr.size()], right_heigest[arr.size()]; //用于记录每列左右最高列,若没有比自己高的则值记为自己
left_heigest[0] = arr[0]; //对于第一列左边最高列为自己
right_heigest[arr.size() - 1] = arr[arr.size() - 1]; ////对于最后一列右边最高列为自己
for(int i = 1; i < arr.size(); i++) { //更新左边最高列
left_heigest[i] = max(arr[i], left_heigest[i - 1]); //最高列具有传递性,只需比较自己和前一列左边最高列
}
for(int i = arr.size() - 2; i >= 0; i--) { //更新右边最高列
right_heigest[i] = max(arr[i], right_heigest[i + 1]); //最高列具有传递性,只需比较自己和后一列右边最高列
int dif = min(left_heigest[i], right_heigest[i]) - arr[i]; //这里已经知道左右最高列了,和两个最高列中较小值进行差值计算
if(dif > 0) res += dif; //大于0才能盛水
}
return res; //返回结果
}
};双指针:
class Solution {
public:
long long maxWater(vector<int>& arr) {
if(arr.size() <= 2) return 0;
long long res = 0;
int left = 0, right = arr.size() - 1; //头尾左右指针
int left_longest = 0, right_longest = 0; //记录左指针左边的最高值,右指针右边的最高值
while(left <= right) { //或者left < right, 下面改成
if(left_longest < right_longest) { //arr[left] < arr[right]
arr[left] >= left_longest ? left_longest = arr[left] : res += left_longest - arr[left];
left++;
}
else {
arr[right] >= right_longest ? right_longest = arr[right] : res += right_longest - arr[right];
right--;
}
}
return res;
}
};
京公网安备 11010502036488号