给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 :
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
def max_capacity(arr):
"""
思路:定义最左和最右两个指针,两个指针中低的那一个*他们之前的距离=容积,然后,指针低的那一个向右移,为什么是指针低的那一
个向内移呢,因为指针低的下一位,高度一定是变高的,和后面的指针形成的容积就有可能比前一个容积大,反之,如果是指针大的向内移,那么形成的容积一定是更小,不成立
"""
i, res, j = 0, 0, len(arr) - 1
while i < j: #左右指针相遇就停止循环,返回res
#如果左指针对应的高度小于右指针,取容积积和res较大的作为新的容积,i += 1
if arr[i] < arr[j]:
res = max(res, arr[i] * (j-i))
i += 1
#else, 取容积积和res较大的作为新的容积j -= 1
else:
res = max(res, arr[j] * (j - i))
j -= 1
return res
height = [1,8,6,2,5,4,8,3,7]
print(max_capacity(height))