大连市开发区网站建设公司,潍坊兆通网站建设,口碑营销的特点,推广网站的公司给定 n 个非负整数表示每个宽度为 1 的柱子的高度图#xff0c;计算按此排列的柱子#xff0c;下雨之后能接多少雨水。
示例 1#xff1a; 输入#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]
输出#xff1a;6
解释#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …
给定 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
按照列方向计算只要记录左边柱子的最高高度和右边柱子的最高高度就可以计算出当前位置雨水的面积当前位置的雨水面积[min(左边柱子的最高高度右边柱子的最高高度)-当前柱子高度]x1
使用双指针来遍历每到一个柱子都向两边遍历一遍会有重复计算我们将每个位置左边最高高度记录在一个数组中右边最高高度记录在一个数组中
当前位置左边最高高度是前一个位置左边最高高度和本高度比较后的最大值 从左向右maxLeft[i]max(height[i],maxLeft[i]) 从右向左maxRight[i]max(height[i],maxRight[i1])
class Solution {public int trap(int[] height) {int lenheight.length;if(len2) return 0;int[] maxLeftnew int[len];int[] maxRightnew int[len];
maxLeft[0]height[0];for(int i1;ilen;i){maxLeft[i]Math.max(height[i],maxLeft[i-1]);}
maxRight[len-1]height[len-1];for(int ilen-2;i0;i--){maxRight[i]Math.max(height[i],maxRight[i1]);}
int sum0;for(int i0;ilen;i){int countMath.min(maxLeft[i],maxRight[i])-height[i];if(count0) sumcount;}return sum;}
}