42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入: height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
解释: 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入: height = [4,2,0,3,2,5]
输出: 9
本题与 11. 盛最多水的容器 相似,均可以使用双指针方法解题。对于本题我们需要求最大容量,而容量取决于左右最小或者说最低的值(本地已经设定好宽度为1的柱子,只需要考虑柱子的左右高度即:左右最小的那个值)。
求获取最大容量我们需要尽可能的去获取左右最大值。所以在遍历时对于未知值就将较小的移动去尝试获取下一个最大值。
public static int trap2(int[] height) {
// 初始化左右指针及结果
int left = 0, right = height.length - 1, res = 0;
// 初始化左右最大高度
int lMax = 0, rMax = 0;
while(left<=right){// 每个柱子都有容量,此处可相等
// 获取当前左右最大高度
lMax = Math.max(lMax,height[left]);
rMax = Math.max(rMax,height[right]);
// 努力获取最大容量,就需要移动最小的高度,去尝试找到最大高度
if(lMax<rMax){
//当左侧比右侧小 计算结果 左指针 向右移动左侧
res += lMax-height[left];
left++;
}else {
//当右侧比左侧小 计算结果 右指针 向左移动右侧
res += rMax-height[right];
right--;
}
}
return res;
}
运行结果如下:
个人见解不喜勿喷!!!