每日算法一技,【Leetcode】Python如何实现盛最多水的容器?

今天图解的题目来源于 LeetCode 第 11 号问题:盛最多水的容器。这是一道可以使用双指针 的技巧来解题的经典题目。

题目描述

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

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

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
if __name__ == '__main__':
    test = Solution()
    list = [1,8,6,2,5,4,8,3,7]
    result = test.maxArea(list)
    print(result)

你可能感兴趣的:(Python算法)