给定 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) {
//当前位置能接到雨水的多少,与当前位置的高度还有当前位置左右的最大高度的最小值有关
//比如当前位置是1,左面最高是3,右面最高是4,那当前位置能接的雨水就是3-1=2
int n = height.length;
int ans = 0;
//记录每个位置左边最大高度,第一个位置跳过去,从左到右遍历
int[] maxLeft = new int[n];
maxLeft[0] = height[0];
for(int i = 1;i<n;i++){
maxLeft[i] = Math.max(maxLeft[i-1],height[i]);
}
//记录每个位置右边最大高度,最后一个位置跳过去,从右到左遍历
int[] maxRight = new int[n];
maxRight[n-1] = height[n-1];
for(int i = n-2;i>=0;i--){
maxRight[i]=Math.max(maxRight[i+1],height[i]);
}
//计算所有位置能接到雨水的和
for(int i = 0;i<n;i++){
ans += Math.min(maxLeft[i],maxRight[i]) - height[i];
}
return ans;
}
}