1、题目描述
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
2、算法分析
这个题只看首尾,首尾的高度决定面积的大小。
双指针分别指向数组首尾。
设两指针 ii , jj ,指向的水槽板高度分别为 h[i]h[i] , h[j]h[j] ,此状态下水槽面积为 S(i, j)S(i,j) 。由于可容纳水的高度由两板中的 短板 决定,因此可得如下 面积公式 :
S(i,j)=min(h[i],h[j])×(j−i)
在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 -1−1 变短
若向内 移动短板 ,水槽的短板 min(h[i], h[j])min(h[i],h[j]) 可能变大,因此下个水槽的面积 可能增大 。
若向内 移动长板 ,水槽的短板 min(h[i], h[j])min(h[i],h[j]) 不变或变小,因此下个水槽的面积 一定变小 。
3、代码实现
class Solution {
public int maxArea(int[] height) {
int result = 0;
int i = 0;
int j = height.length - 1;
while(i < j){
int maxArea = (j - i) * Math.min(height[i],height[j]);
result = Math.max(maxArea,result);
// 取较小的,面积可能会变大。
if(height[i] < height[j]){
i++;
}else{
j--;
}
}
return result;
}
}