Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1]
, return 6
.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
最开始的思路是检查每个位置,以当前高度为“谷”向左右尽可能地扫,扫到左右的最高壁计算水量,处理起来还是挺麻烦的,换一种思路,当前位置有一个高度,当前位置左右的最高高度通过维护两个数组,数组元素分别i代表从左开始到i的最高高度和从右开始到i的最高高度也很容易知道,每次计算水量的时候,就以两边短的和当前高度作差,只计算当前格子的水量,累加所有格子水量得到总水量。
public class Solution {
public static int trap(int[] height)
{
int len=height.length;
if(len<2)
return 0;
int[] leftmax=new int[len];
int[] rightmax=new int[len];
int max=0;
for(int i=0;i<len;i++)
{
if(height[i]>max)
max=height[i];
leftmax[i]=max;
}
max=0;
for(int i=len-1;i>=0;i--)
{
if(height[i]>max)
max=height[i];
rightmax[i]=max;
}
int store=0;
for(int i=0;i<len;i++)
store+=Math.min(leftmax[i], rightmax[i])-height[i];
return store;
}
}