给定一个长度为
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_area
solution = Solution()
x = [1,8,6,2,5,4,8,3,7]
x1 = [1,1]
print(solution.maxArea(x))
print(solution.maxArea(x1))