题目:给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解题思路:
要计算下雨后能接多少雨水,可以使用双指针的方法来解决。
首先,定义两个指针left和right分别指向数组的最左边和最右边。
然后,定义两个变量left_max和right_max分别表示左边最高的柱子和右边最高的柱子。
接下来,使用while循环,不断地移动指针left和right,并更新left_max和right_max。
在每次循环中,如果当前位置的柱子高度小于等于left_max和right_max中的较小值,那么这个位置可以接到雨水,可以计算出当前位置能接到的雨水量,然后将指针向中间移动一步。
如果当前位置的柱子高度大于left_max和right_max中的较小值,那么这个位置不能接到雨水,需要更新left_max和right_max。
最后,当left和right相遇时,计算完所有位置的雨水量后,就得到了总的雨水量。
public int trap(int[] height) {
int left = 0, right = height.length - 1;
int left_max = 0, right_max = 0;
int result = 0;
while (left < right) {
// 如果当前位置的柱子高度小于等于left_max和right_max中的较小值
if (height[left] <= height[right]) {
// 计算当前位置能接到的雨水量
if (height[left] >= left_max) {
left_max = height[left];
} else {
result += left_max - height[left];
}
left++;
} else {
// 计算当前位置能接到的雨水量
if (height[right] >= right_max) {
right_max = height[right];
} else {
result += right_max - height[right];
}
right--;
}
}
return result;
}