思路:
首先,设置两个指针i, j ,一个在最左边,一个在最右边。
每次将 h[ i ] , h[ j ] 中对应着较短的垂线的指针,向内缩进一个。不断移动i , j,直到 i 不小于j 为止。
记录每次指针之间的面积,最后输出最大面积。
为什么双指针法是对的呢?比如我们现在两个指针指向的h[ i ] < h[ j ]。i 指向的是短板,j 指向的是长板。如果我们固定 i ,向内移动 j,那么因为水槽的面积取决于短板的面积,不管 j 移动到的位置的板多长,水槽的面积只能比以前小。所以,i不动,j无论向内移动到什么位置,都会造成水槽面积变小。这样我们就省去了向内移动 j 的操作,这是剪枝的思想。每次我们只移动指向短板的指针。
还有一个问题,当 h[ i ] == h[ j ] 的时候,我们发现,无论固定 j 向内移动 i ,还是固定 i 向内移动 j ,都会造成水槽面积变小,所以这时候我们就同时将 i ,j 都向内移动一个。
@nettee写的这部分题解很精彩,推荐看一下: nettee盛水最多的容器题解
class Solution {
public int maxArea(int[] height) {
int i = 0;
int j = height.length-1;
int max = 0;
while(i<j)
{
int hei = Math.min(height[i],height[j]);
int dis = Math.abs(i-j);
int sq = hei*dis;
max = Math.max(max,sq);
if(height[i]<height[j])
{
i++;
}
else if(height[i]>height[j])
{
j--;
}
else
{
i++;
j--;
}
}
return max;
}
}