题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
![](https://img.haomeiwen.com/i9331365/843513fd0cbfa254.png)
输入: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
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
Java代码实现
class Solution {
public int trap(int[] height) {
int left = 0;
int right = height.length - 1;
int leftMax = 0;
int rightMax = 0;
int total = 0;
while (left <= right) {
if (height[left] <= height[right]) {
if (height[left] > leftMax) {
leftMax = height[left];
} else {
total += leftMax - height[left];
}
left++;
} else {
if (height[right] > rightMax) {
rightMax = height[right];
} else {
total += rightMax - height[right];
}
right--;
}
}
return total;
}
}
算法解释
这段代码是使用双指针的方法来解决接雨水问题。
-
首先,定义两个指针left和right,分别指向数组的第一个元素和最后一个元素。
-
然后,定义两个变量leftMax和rightMax,分别用来保存左边和右边的最大高度。
-
接着,定义一个变量total用来保存接雨水的总量。
-
在循环中,当left <= right时,进行以下操作:
i. 如果height[left] <= height[right],说明左边的高度较小,那么可以确定左边能接到的雨水量,即leftMax - height[left],将这个结果累加到total中。
然后更新leftMax的值,如果height[left]大于leftMax,将leftMax更新为height[left]。
最后,将left指针向右移动一位。
ii. 如果height[left] > height[right],说明右边的高度较小,那么可以确定右边能接到的雨水量,即rightMax - height[right],将这个结果累加到total中。
然后更新rightMax的值,如果height[right]大于rightMax,将rightMax更新为height[right]。
最后,将right指针向左移动一位。 -
循环结束后,返回total即为最后的结果,即接到的雨水总量。
这个方法的时间复杂度是O(n),其中n是数组的长度。
网友评论