给定 n 个非负整数表示每个宽度为 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
解题思路:利用的是双指针的暴力方法,对于数组中的每个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。
大概的左边最大值和右边的最大值的理解可以参考下面这个图:
相当于是在算每一个格子它左右两边的墙最高能有多高(并不是说最靠近那一个格子的墙有多高)
最重要的是!!!!!我们找出每一个格子下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。然后再把所有格子接的雨水总量加起来就是这个题的答案。
上代码吧,Java语言:
class Solution {
public int trap(int[] height) {
int left=0,right=height.length-1;
int answer=0;
for(int i=0;i<height.length-1;i++){
int max_left=0,max_right=0;
for(int j=i;j>=0;j--){//从左扫描找到最高点
max_left=Math.max(max_left,height[j]);
}
for(int j=i;j<height.length;j++){
max_right=Math.max(max_right,height[j]);
}
answer=answer+Math.min(max_left, max_right) - height[i];
}//每一格子的雨水量等于两边最大高度的较小值减去当前高度的值
return answer;
}
}