给你 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
思路--双指针法
左右指针分别指向数组的左右两端
它们可以容纳的水量=两个指针指向的数字中较小值∗指针之间的距离
此时我们需要移动一个指针。移动哪一个呢?
通过上面水的容量计算公式可以看出:
1、无论左移还是右移指针,指针之间的距离都是越来越小的;所以主要看如何移动指针指向的数字。
2、如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针。
python3解法--双指针法
class Solution:
def maxArea(self, height: List[int]) -> int:
if not height or len(height) < 2:
return 0
left, right = 0, len(height) - 1
ans = 0
while left < right:
ans = max(ans, (right - left) * min(height[right], height[left]))
if height[right] < height[left]:
right -= 1
else:
left += 1
return ans
python3解法--暴力解法
class Solution:
def maxArea(self, height: List[int]) -> int:
ans = 0
for i in range(0, len(height) - 1):
for j in range(i + 1, len(height)):
ans = max(ans, (j - i) * min(height[j], height[i]))
return ans