题目
给你 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
题解
算法流程:
1.初始化:双指针indexS
,indexE
分列水槽左右两端;
2.循环收窄: 直至双指针相遇时跳出;
(1)更新面积最大值res
;
(2)选定两板高度中的短板,向中间收窄一格;
3.返回值:返回面积最大值res
即可;
代码
const maxArea = function (height) {
const len = height.length;
let res = 0;
let indexS = 0;
let indexE = len - 1;
while (indexS < indexE) {
if (height[indexS] < height[indexE]) {
res = Math.max(res, height[indexS] * (indexE - indexS));
indexS++;
} else {
res = Math.max(res, height[indexE] * (indexE - indexS));
indexE--;
}
}
return res;
};
复杂度分析:
时间复杂度O(n):双指针遍历一次底边宽度n
。
空间复杂度O(1):变量len
,indexS
,indexE
,res
使用常数额外空间。