题目
来源:LeetCode.
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。
在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。
在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
示例 3:
输入:height = [4,3,2,1,4]
输出:16
示例 4:
输入:height = [1,2,1]
输出:2
提示:
n = height.length
2 <= n <= 3 * 104
0 <= height[i] <= 3 * 104
接下来看一下解题思路:
思路(双指针):
这道题要计算出坐标轴最大的面积,取决于左右边界的值和边界的距离;
所以可以采用双指针来解决;
初始时左右指针分别位于左右边界,然后比较左右边界的值;
为了保证面积最大,每次移动小的那一个边界,保留值大的边界;
然后计算当前的面积,存储最大的面积;
最后返回这个最大面积即可;
临界条件是左右边界相遇;
public static int maxArea(int[] height) {
if (height.length < 2) {
return height[0];
}
int i = 0;
int j = height.length - 1;
int sum = 0;
while (i != j) {
// 最大面积为 最小边界乘以左右边界的长
int record = Math.min(height[i], height[j]) * (j - i);
// 记录最大值
sum = Math.max(record, sum);
// 每次移动左右边界相对较小的那个
if (height[i] > height[j]) {
--j;
} else {
++i;
}
}
return sum;
}
}
总结
时间复杂度 O(n),双指针总计最多遍历整个数组一次;
空间复杂度 O(1),只需要额外的常数级别的空间;