给定 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
提示:
n == height.length1 <= n <= 2 * 1040 <= height[i] <= 105
思路:
- 使用双指针,一次遍历
- 计算当前柱子,左边的柱子最高的高度,右边的柱子最高的高度
- 能存水,需要当前柱子高度小于左右两边最高柱子高度的最小值
- 存水量,min(lmax, rmax) - height[i]
- 时间复杂度O(n)
解答:
public int trap(int[] height) {
//使用双指针
int left = 0;
int right = height.length - 1;
int lmax = height[left];
int rmax = height[right];
int sum = 0;
while (left < right) {
lmax = Math.max(height[left], lmax);
rmax = Math.max(height[right], rmax);
if (lmax < rmax) {
sum = sum + lmax - height[left];
left++;
} else {
sum = sum + rmax - height[right];
right--;
}
}
return sum;
}