题目描述:
标签:数组 双指针
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
代码:
思路分析:
1、数学分析:容器的容量取决于 底长 + 两侧垂直线的高度 。我们先让底长最大,然后去找使面积最大的垂直线高度。
2、代码分析:(1)定义双指针 left , right。分别指向数组的第一个元素和最后一个元素,此时的容器拥有最大的底长。
(2)此时先比较左右指针指向的元素大小,让小的元素移动指针,找到那个比当前高度大的下标(left++,right--)
(3)比较面积大小,存储最大面积
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int left = 0;
int right = len-1;
int maxsize = Math.min(height[left],height[right])*(right - left);
while(left < right){
if(height[left] < height[right]){
int left0 = left;
left++;
while(height[left] < height[left0]){
left++;
}
}else{
int right0 = right;
right--;
while(height[right] < height[right0]){
right--;
}
}
int size = Math.min(height[left],height[right])*(right - left);
if(size > maxsize){
maxsize = size;
}
}
return maxsize;
}
}