https://leetcode.com/problems/trapping-rain-water/
这个问题我们采用的算法是全局遍历,找到最高点所在的index,然后对于左侧和右侧,分别计算蓄水量。对于左侧,蓄水量为左侧最大高度 – 当前高度,然后将蓄水量相加;右侧也是一样,从右向左遍历,蓄水量为右侧最大高度 – 当前高度。最后结果是左右之和。
具体看代码,加了注释,很容易看懂。
public int trap(int[] height) {
int hightest_index = 0;
int left_hightest = 0;
int right_hightest = 0;
int water = 0;
// 计算全局最高的位置index,对于最高点左侧和右侧,分开进行蓄水计算。
// 由于木桶原理,左侧和右侧能蓄水的数量,和左侧、右侧的高度差有关
for (int i = 0; i < height.length; i++) {
if (height[hightest_index] < height[i]) hightest_index = i;
}
// 计算左侧最低的高度,对于低于这个高度的地区,计算water的值
for (int i = 0; i < hightest_index; i++) {
if (height[i] > left_hightest) {
left_hightest = height[i];
} else {
water += left_hightest - height[i];
}
}
// 遍历最高点右侧,只需要考虑右侧最高的挡板高度
for (int i = height.length - 1; i > hightest_index; i--) {
if (height[i] > right_hightest) {
right_hightest = height[i];
} else {
water += right_hightest - height[i];
}
}
return water;
}