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; } };