1、题目解析
根据图示可以看出,容积取决于两个条件,一是容器两边中最小边的长度,二是容器两边的距离,即底和高。因此我们需要计算的就是这两个数据。
因此在程序中我们需要设置的变量有:
- 最大面积max(记录循环过程中产生的最大值)
- 两个指向容器两端的指针(确定容器底边长度和高度)
2、实现代码
2.1暴力求解
根据题目含义,我们需要写出两重循环,遍历每一种可能的情况。
public int maxArea(int[] height) {
int area = 0;
for (int i = 0; i< height.length - 1; i++){
for(int j =i+1; j<height.length; j++){
int new_area = Math.min(height[i],height[j]) * (j-i);
area = Math.max(area,new_area);
}
}
return area;
}
定义变量i,j从头开始依次对所有可能的情况进行遍历,这里要注意j要从i+1开始执行,因为容器的两端是不能重合的,同时i的循环是在数组的倒数第二个位置,j的循环是数组的最后一个位置。
2.2 双指针前后夹逼
public int maxArea(int[] height) {
int area = 0;
for (int i = 0,j = height.length-1; i < j;) {
int minHeight = height[i] < height[j] ? height[i++] : height[j--];
int new_area = minHeight * (j - i + 1);
area = Math.max(area,new_area);
}
return area;
}
容器的底长度可以根据两个指针的距离差来计算,这里没有可以优化的地方,因此我们需要对高度的选择进行优化。
通过双指针前后夹逼的方式,只需要一次循环,时间复杂度为0(n)。
解题思路:比较两指针对应的长度,选取长度较短的一段作为高,同时对应的指针需要向其运动方向移动一格(i向右移,j向左移)。
在两端不断靠近的过程中,底边长度不断减小,而我们容器的判定还需要根据高度来决定,所有需要找到尽量高的边来弥补底边减少的带来的差距。
第一次写博文,写得不是很好,如有不足可以来跟我分享意见。