常规方法
就是根据这个图抽象成程序
public static int maxArea_outTime(int[] height) {//超时
int size=0;
for(int i=0;i<height.length;i++)
{
for(int j=i;j<height.length;j++)
{
int x=j-i;
int y=Math.min(height[i],height[j]);
if(x*y>size)
size=x*y;
}
}
return size;
}
从最左边开始遍历,不断计算面积,记录最大值。不过提交时超时了,超时的情况是一份庞大的数组。
双指针法
public static int maxArea(int[] height) {//双指针
int size=0;
for(int i=0,j=height.length-1;i<j;)
{
int tmp = (j - i) * Math.min(height[i], height[j]);
if(tmp >size)
size= tmp;
if(height[i]<height[j])
i++;
else j--;
}
return size;
}
从数组两端开始,设置头尾指针,向中间靠拢的过程中就会遍历所有符合算法的结果(并非所有结果),避免了上面方法的重复计算过程。遍历的规则是移动数值较小的指针。
容量=两指针较小值×两指针距离
如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针。