题目
attleetcode 41. 接雨水
代码
public static
//leetcode submit region begin(Prohibit modification and deletion)
/**
* 计算装满水后,水和墙壁的总体积
* 用总体积减去墙壁的体积,就是水的体积
*/
class Solution {
public int trap(int[] height) {
if (height.length < 3) {
return 0;
}
int len = height.length;
int left = 0, right = len - 1; // 左右双指针
int leftMax = 0, rightMax = 0; // 左右两边最高的柱子
// 水的体积 = sumTotal - sumHeight
int sumTotal = 0; // 柱子+水的体积
int sumHeight = 0; // 柱子体积
while (left <= right) {
int leftHeight = height[left]; // 左边柱子高度
int rightHeight = height[right]; // 右边柱子高度
// 处理较矮的柱子
if (leftHeight <= rightHeight) {
// 左边柱子矮
leftMax = Math.max(leftMax, leftHeight); // 左边已遍历过的最高的柱子
sumTotal += leftMax; // 增加总的体积
sumHeight += leftHeight; // 增加柱子的体积
left++;
} else {
// 右边柱子矮
rightMax = Math.max(rightMax, rightHeight); // 右边已遍历过的最高的柱子
sumTotal += rightMax; // 增加总的体积
sumHeight += rightHeight; // 增加柱子的体积
right--;
}
}
return sumTotal - sumHeight; // 总体积 - 柱子体积
}
}
//leetcode submit region end(Prohibit modification and deletion)