问题描述
给定 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 个单位的雨水(蓝色部分表示雨水)。
题解
使用两个数组,记录每个位置从左边看的最大值和从右边看的最大值,每个位置可以存放的水量是从该位置中左右两端最大值选择最小值(表示该位置可以降水的量)减去该位置本身的值(表示该位置已占有的量)。如果长度不如3的话,需要单独处理,直接返回0,因为没法存水。
代码
class Solution {public int trap(int[] height) {int ans = 0;int len = height.length;if(len < 3) return 0;int left_max_arr[] = new int[len];int right_max_arr[] = new int[len];left_max_arr[0] = height[0];right_max_arr[len-1] = height[len-1];for(int i = 1;i<len;i++) {left_max_arr[i] = Math.max(left_max_arr[i-1], height[i]);}for(int i = len-2; i>=0;i--) {right_max_arr[i] = Math.max(right_max_arr[i+1], height[i]);}for(int i = 0; i<len; i++) {ans += Math.min(left_max_arr[i], right_max_arr[i]) - height[i];}return ans;}
}