# 11.盛最多水的容器
给你 n
个非负整数 a1,a2,...,an
,每个数代表坐标中的一个点 (i, ai)
。在坐标内画 n
条垂直线,垂直线 i
的两个端点分别为 (i, ai)
和 (i, 0)
。找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
# 思路
根据面积计算规则,面积是由两个柱子的距离和柱子最低高度决定的。
所以,一开始前后指针指向第一根柱子和最后一根柱子,计算这两根柱子的面积,此时他们距离是最大的。
由于高度收到最低的限制,所以前后指针中高度最低的往中间移动,知道找到比它高的柱子(因为距离在减少,所以只有高度增大才有机会比之前的大),再重新计算面积,并和前面的比较,取最大值。
知道前后指针重合。
# 代码
- 双指针
/**
* @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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18