11 - 盛最多水的容器 - python

给你 n 个非负整数 a 1 a 2 . . . a n a_1,a_2,...,a_n ,每个数代表坐标中的一个点 ( i , a i ) (i, a_i) 。在坐标内画 n 条垂直线,垂直线 i i 的两个端点分别为 ( i , a i ) (i, a_i) ( i , 0 ) (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。


在这里插入图片描述

图中垂直线代表输入数组 [ 1 , 8 , 6 , 2 , 5 , 4 , 8 , 3 , 7 ] [1,8,6,2,5,4,8,3,7] 。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入:[1,8,6,2,5,4,8,3,7]
输出:49

根据木桶原理可知,容器中水的最大容量受限于最短的边。因此,设置双指针leftright分别指向数组的两端,新建变量maxArea保存当前最大的容量。

  • 如果left指向的边较短,则计算此时的容量并更新maxArealeft向右移动
  • 如果right指向的边较短,则计算此时的容量并更新maxArearight向左移动
class Solution:
    def maxArea(self, height: List[int]) -> int:
        if height == []: return 0

        left, right = 0, len(height) - 1
        maxArea = 0
        while left < right:
        	# 计算此时的面积,受限于最短边
            if height[left] < height[right]:
                area = height[left] * (right - left)
                if area > maxArea:
                    maxArea = area
                left += 1
            else:
                area = height[right] * (right - left)
                if area > maxArea:
                    maxArea = area
                right -= 1


        return maxArea
发布了449 篇原创文章 · 获赞 122 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/105193367