方法一:求出每个位置能装多少水,然后把每个位置能装的水加起来,就是总共能装多少水
先求出每个位置左边区域的最大值A
然后求出每个位置右边区域的最大值B
每个位置能装的水=Math.min(A,B)-height[i](有可能Math.min(A,B)>height[i],即Math.min(A,B)-height[i]<0,此时这个位置能装的水就是0)
第一个位置和最后一个位置能装的水为0
class Solution
{
public int trap(int[] height)
{
int[] left=new int[height.length];//记录每个位置左边的最大值
int[] right=new int[height.length];//记录每个位置右边的最大值
int[] result=new int[height.length];//每个位置能够存储的水量,所有位置的加起来就是能存储的水量
//求出每个位置左边的最大值,从左到右遍历
int left_max=height[0];
left[0]=0;
for(int i=1;i<height.length;i++)
{
max=Math.max(left_max,height[i-1]);
left[i]=max;
}
//求出每个位置右边的最大值,从右到左遍历
int right_max=0;
right[height.length-1]=0;
for(int i=height.length-2;i>=0;i--)
{
max=Math.max(right_max,height[i+1]);
right[i]=max;
}
//第一个位置和最后一个位置能装的水都为0
result[0]=0;
result[height.length-1]=0;
for(int i=1;i<=height.length-2;i++)
{
int temp=Math.min(left[i],right[i]);
if(temp>height[i])//用三元表达式就是result[i]=Math.max(0,temp-height[i]);
{
result[i]=temp-height[i];
}
else
{
result[i]=0;
}
}
int sum=0;
for(int i=0;i<result.length;i++)
{
sum=sum+result[i];
}
return sum;
}
}
方法二:双指针