![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/285a133c3afbf3cf1e26d69c2ab147d3.png)
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
如题意,垂直的两条线段将会与坐标轴构成一个矩形区域,较短线段的长度将会作为矩形区域的宽度,两线间距将会作为矩形区域的长度,而我们必须最大化该矩形区域的面积
暴力破解
解题思路
简单考虑每队可能出现的线段组合,并找出这些情况之下的最大面积
时间复杂度:O(n²),两个for循环
空间复杂度:O(1)
class Solution {
public int maxArea(int[] height) {
int maxArea=0;
for(int i=0; i<height.length; i++)
for(int j=i+1; j<height.length; j++)
maxArea =Math.max(Math.min(height[i], height[j])*(j-i) ,maxArea);
return maxArea;
}
}
双指针法:缩短区间
两线段之间形成的区域总是会受到其中较短那条长度的限制
我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。
并将指向较短线段的指针向较长线段那端移动一步。
移动短指针的过程中,一定会遇到可以构成最大面积的情况
反证法
假设移动长指针,移动到next位置,容器宽度变小
若height[next] < height[pa],容器高度 = height[next],高度变小
height[pa]< height[next] < height[pb],容器高度 = height[pa],高度不变
height[next] > height[pa],器高度 = height[pa],高度不变
以上三种情况都会导致容器面积变小,所以移动长指针不会遇到构成最大面积的情况
时间复杂度:O(n),一次扫描
空间复杂度:O(1),使用恒定的空间
class Solution {
public int maxArea(int[] height) {
int pa = 0;
int pb = height.length-1;
int maxArea = 0;
int nowArea = 0;
while(pa != pb){
if(height[pa] <= height[pb]){
nowArea = (pb-pa)*height[pa];
pa++;
}else{
nowArea = (pb-pa)*height[pb];
pb--;
}
maxArea = (nowArea>maxArea)?nowArea:maxArea;
}
return maxArea;
}
}