给定 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;}
}