# 11.盛最多水的容器

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai)(i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

img

# 思路

根据面积计算规则,面积是由两个柱子的距离和柱子最低高度决定的。

所以,一开始前后指针指向第一根柱子和最后一根柱子,计算这两根柱子的面积,此时他们距离是最大的。

由于高度收到最低的限制,所以前后指针中高度最低的往中间移动,知道找到比它高的柱子(因为距离在减少,所以只有高度增大才有机会比之前的大),再重新计算面积,并和前面的比较,取最大值。

知道前后指针重合。

# 代码

  • 双指针
/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    let res=0,start=0,end=height.length -1,cur=0
    while(start < end) {
        let h = height[start] > height[end] ? height[end] : height[start]
        cur = h * (end - start)
        res = cur > res ? cur : res
        if(height[start] < height[end]) {
            start++
        } else {
            end--
        }
    }
    return res
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18