问题链接
问题描述
给你 n
个非负整数 a1,a2,...,an
,每个数代表坐标中的一个点 (i, ai)
。在坐标内画 n
条垂直线,垂直线 i 的两个端点分别为 (i, ai)
和 (i, 0)
。找出其中的两条线,使得它们与 x 轴
共同构成的容器可以容纳最多的水。
- 你不能倾斜容器。
示例
解题思路
核心:双指针
- 从题中可以得到容器的面积公式:
area = (j - i) * Math.min(n[j], n[i])
从公式中可以看出,2条垂直线的距离越远,两条垂直线的最短长度越长,面积越大。 - 双指针解法
首先,我们用2个指针left、right,开始时分别指向数组的最左、最右;我们一边计算此时的面积,一边向中心位置收敛:舍去两个垂直线中较短的一根,如果是左指针,向右移动一个位置;如果是右指针,向左移动一个位置。
代码示例(JAVA)
class Solution {
public int maxArea(int[] height) {
int max = 0;
for (int i = 0, j = height.length - 1; i < j;) {
int minHeight = height[i] < height[j] ? height[i++] : height[j--];
int area = (j - i + 1) * minHeight;
max = Math.max(max, area);
}
return max;
}
}
执行结果