leetcode__11.盛最多水的容器__python

题目:

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

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

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

解题思路:

这一道题的思路,就是利用双指针法,一个指针在数组的首元素,一个指针在数组的尾元素,只需要O(n)的时间复杂度就能解决这个问题。
具体细节:
1.当首元素小于尾元素的时候,将前指针往后移动,找到一个比前指针之前指的那个值大的位置,然后计算容器体积;
2.当首元素大于尾元素的时候,将后指针向前移动,找到一个比后指针之前指的那个值大的位置,然后计算容器体积;
3.在迭代的过程中,更新容器体积的值,如果新的体积比之前大则代替,否则不变。

具体代码如下:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        '''
        双指针法
        '''
        first_ptr = 0
        second_ptr = len(height) - 1
        first = first_ptr
        second = second_ptr
        tmp = min(height[first], height[second])
        res = tmp * (second_ptr - first_ptr)
        while first_ptr < second_ptr:
            if height[first] < height[second]:
                first_ptr += 1
                if height[first_ptr] > height[first]:
                    first = first_ptr
                    tmp = min(height[first], height[second])
                    res = max(res, tmp * (second - first))
            else:
                second_ptr -= 1
                if height[second_ptr] > height[second]:
                    second = second_ptr
                    tmp = min(height[first], height[second])
                    res = max(res, tmp * (second - first))
        return res  

提交结果:

leetcode__11.盛最多水的容器__python_第1张图片

你可能感兴趣的:(leetcode,python)