题目
思路及代码
思路1 暴力循环(数组元素过多会超时)
(1)从第一个元素开始到倒数第二个元素都有机会作为容器的左壁高度
for(int i=0;i<height.length-1;i++)
(2)从该元素的下一个元素开始一直到最后一个元素,都有机会作为容器的右壁高度
for(int j=i+1;j<height.length;j++)
(3)选取左壁和右壁较低的作为当前形成的容器的高度,选择左壁与右壁之间的的距离作为容器底的长度,即可计算容器可盛水量
int len=j-i;
int curWater=Math.min(height[i],height[j])*len;
(4)将当前容器可盛水量与已得到的最大可盛水量比较,看是否需要进行最大可盛水量的更新
maxWater=maxWater<curWater?curWater:maxWater;
class Solution {
public int maxArea(int[] height) {
//保存已求得的可容纳的最多的水
int maxWater=0;
//遍历数组元素,每次选取一个元素作为左边的端点
for(int i=0;i<height.length-1;i++)
{
//从下一个位置开始,将每个元素都作为右边的端点,然后求此时可容纳的水的面积
for(int j=i+1;j<height.length;j++)
{
//容器底的长度
int len=j-i;
//容器的高选取左右端点较小的那个
int curWater=Math.min(height[i],height[j])*len;
maxWater=maxWater<curWater?curWater:maxWater;
}
}
return maxWater;
}
}
思路2 双指针——移动短板向内
创建两个指针,指针i
指向容器左壁,指针j
指向容器右壁,计算容器可盛水量,然后对指针进行移动,移动指针的条件如下
移动短板向内或移动长版向内,容器底的长度都会缩短
(1)移动短板向内,短板可能会变大,此时盛水量可能增大可能减小
(2)移动长板向内,短板可能不变或变小,此时盛水量必然减小
因此移动短板向内
class Solution {
public int maxArea(int[] height) {
int i=0,j=height.length-1;
int maxWater=0;
while(i<j)
{
int curWater=Math.min(height[i],height[j])*(j-i);
maxWater=maxWater<curWater?curWater:maxWater;
//移动短板向内或移动长版向内,容器底的长度都会缩短
//但是移动短板向内,短板可能会变大
//而移动长板向内,短板可能不变或变小,因此移动短板向内
if(height[i]<height[j])
i++;
else
j--;
}
return maxWater;
}
}