代码:
class Solution {public int maxArea(int[] height) {int n=height.length;int left=0;int right=n-1;int max=0;while (left<right){//计算当前 left 和 right 所在位置的面积int area=Math.min(height[left],height[right])*(right-left);//重置最大值if(area>max){max=area;}//调整选取的线,尝试获得更大的面积if(height[left]<height[right]){left++;}else {right--;}}return max;}
}
题解:
1.首先题目需要我们获取到容器的最大面积,面积的计算就是 底 x 高 ,对于示例1,得到的最大面积是 7x7=49,根据图形进行分析,高度为 7 是因为容器的高度取决于短的那条边,所以高度是 min(8,7),底是两条边之间的距离,两条边的下标分别为 1,8 ,底为 8-1=7
根据上面的分析,我们假设指针 left 指向下标 1 的边,right 指向下标 8 的边,面积 area=min( height [ left ] , height [ right ])x ( right - left )
2. 我们使用示例 1 来进行分析
首先假设我们有一个变量 max=0 ,用来保存此时分析出的最大面积
我们的目的是要获得最大的面积,所以我们可以一开始让 left 指向下标 0 ,right 指向下标 height.length - 1,此时构成的图形底边是最长的,我们可以计算出当前的面积为1 x 8 = 8,当前的面积(8) > max(0) 就覆盖 max 的值
1 8 6 2 5 4 8 3 7
L R
接下来,我们想尽可能的获取更大的面积但此时无论是移动 left 还是 rght 都会导致底边变小,所以我们移动以后高度就得变大才行,所以我们要淘汰两条边中较小的那条边,left 指向的边是 1 ,right 指向的边是 7,所以我们选择让 left++ 向右移动,把 1 这条边淘汰
1 8 6 2 5 4 8 3 7
L R
此时得到的面积为 7 x 7 =49 ,当前的面积(49) > max(8) 就覆盖 max 的值,然后我们继续淘汰两条边中较小的那条边,此时 right 指向的 7 较小,所以我们要让 right -- 向左移动
一直循环上述的操作,直到 left 和 right 相遇,此时 max 中的值就是最大的面积