
给定一个长度为
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。
输入:height = [1,1] 输出:1

这种解决方法的核心思想是通过不断缩小有效宽度的范围,来寻找容器的最大面积。通过比较较小高度的指针向内移动,可以保留更有可能得到更大面积的高度。最终,我们得到了两条垂线所形成容器的最大面积。


class Solution(object):
def maxArea(self, height):
n = len(height) # 获取数组height的长度n
left, right = 0, n - 1 # 初始化左指针left为0,右指针right为数组最后一个元素的下标n-1
max_area = 0 # 初始化最大面积max_area为0
while left < right: # 进入循环,条件是左指针left小于右指针right
curr_area = min(height[left], height[right]) * (right - left) # 计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离
max_area = max(max_area, curr_area) # 更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_area
if height[left] < height[right]: # 如果height[left]小于height[right]
left += 1 # 移动左指针left向右移动一位
elif height[left] > height[right]: # 如果height[left]大于height[right]
right -= 1 # 移动右指针right向左移动一位
else: # 如果height[left]等于height[right]
left += 1 # 同时移动左指针left向右移动一位
right -= 1 # 同时移动右指针right向左移动一位
return max_area # 返回最大面积max_area作为结果class Solution(object): def maxArea(self, height): n = len(height) left, right = 0, n - 1 max_area = 0 while left < right: curr_area = min(height[left], height[right]) * (right - left) max_area = max(max_area, curr_area) if height[left] < height[right]:
left += 1 elif height[left] > height[right]:
right -= 1 else:
left += 1
right -= 1 return max_areasolution = Solution()
x = [1,8,6,2,5,4,8,3,7]
x1 = [1,1]
print(solution.maxArea(x))
print(solution.maxArea(x1))