class Solution {
public:
long long maxWater(vector<int>& arr) {
if (arr.size() <= 2) return 0;
int left = 0, right = arr.size() - 1;
int left_max = 0, right_max = 0;
long long result = 0;
while (left < right) {
// 更新左右两边的最大高度
left_max = max(left_max, arr[left]);
right_max = max(right_max, arr[right]);
// 移动较矮的一侧指针
if (arr[left] < arr[right]) {
// 左边较矮,计算左边能接的雨水
result += left_max - arr[left];
left++;
} else {
// 右边较矮,计算右边能接的雨水
result += right_max - arr[right];
right--;
}
}
return result;
}
};
思路:
- 使用左右两个指针,分别从数组两端开始向中间移动
- 维护左右两边的最大高度
- 每次移动高度较小的一侧的指针,因为接雨水的量由较矮的一边决定
- 计算当前位置能接的雨水量
- 双指针方法的优雅之处就在于它充分利用了"短板效应",每次只处理确定能接雨水的位置,避免了复杂的全局计算。这正是算法设计中"局部最优导致全局最优"的经典体现。

京公网安备 11010502036488号