7.接雨水
给定 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.length
- 1 <= n <= 2 * 104
- 0 <= height[i] <= 105
代码:
class Solution {
public int trap(int[] height) {
//left数组表示每个柱子左侧最高柱子的高度(包括自己在内)
int[] left = new int[100005];
//right数组表示每个柱子右侧最高柱子的高度(包括自己在内)
int[] right = new int[100005];
//n表示height数组的长度
int n = height.length;
//如果是第一根柱子,则其左侧最高柱子只能是自己
left[0] = height[0];
for(int i = 1;i<n;i++){
//否则,第i根柱子左侧(包括自己)最高柱子的高度 = max(第i-1根柱子左侧最高柱子的长度,第i根柱子的高度)
left[i] = Math.max(left[i-1],height[i]);
}
//如果是最后一根柱子,则其右侧最高柱子只能是自己
right[n-1] = height[n-1];
for(int i = n-2;i>=0;i--){
////否则,第i根柱子右侧(包括自己)最高柱子的高度 = max(第i+1根柱子右侧最高柱子的长度,第i根柱子的高度)
right[i] = Math.max(right[i+1],height[i]);
}
//res用于记录总接水量
int res = 0;
//循环遍历n根柱子,第i根柱子所能接水的量即为min(第i根柱子左侧(包括自己)最高柱子的长度,第i根柱子右侧(包括自己)最高柱子的长度)-第i根柱子的高度
//累加结果
for(int i=0;i<n;i++)res += Math.min(left[i],right[i])-height[i];
//返回总接水量
return res;
}
}

浙公网安备 33010602011771号