【Leetcode】Python实现盛最多水的容器

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

注意:你不能倾斜容器,n 至少是2。

分析题意,为和y轴平行的直线,主要在两者下标为宽,直线ai为高,两者相乘求最大面积,使用逼近法

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        """
        逼近法 
        每次左右两端都舍去短的那一端 
        若选择短的那一端【S=小于等于此端的高*小于等于当前的最大区间长度】
        至多的面积也是选择最左最右的一个矩形,因此不必再考虑短的一端,直接舍去逼近
        """
        # 记录当前最大容量的面积
        max_area = 0
        # 记录最左边的下标
        left = 0
        # 记录右边的下标
        right = len(height) - 1
        # 当右边下标大于左边下标的时候循环
        while right > left:
            # 当前循环中最大的容量面积,使用max方法比较上次的max_area和此次的容量面积,取最大值
            # min(height[left], height[right]) * (right - left) 取左边和右边的高当中的最小值, 下标right-left为宽,两者相乘为最大面积
            max_area = max(max_area, min(height[left], height[right]) * (right - left))
            # 判断哪条高小,小的那边下标进行操作
            if height[right] > height[left]:
                left += 1
            else:
                right -= 1
        return max_area

猜你喜欢

转载自blog.csdn.net/chenhua1125/article/details/80502764