11. 盛最多水的容器
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
可以选择使用暴力美学:从左到右遍历一次。但是空间复杂度为O(n^2)。这里使用的是双指针方法,空间复杂度为O(n)。
- 左右两边指针计算出当前盛水的面积
- 数值少的指针则往中间靠(根据木桶效应,盛水多少由最短的木板决定[虽然这里还要根据底边的长度决定)因为这里的高度和底部的度量单位都是
1格
,只有增加短边才能获得更高的水位。 - 计算更新之后的面积,和之前的面积取最大的那个
from typing