leetcode-11 | 盛最多水的容器 中等难度

11. 盛最多水的容器(Container With Most Water)

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

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

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

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

思路

方法一: 暴力法

两重循环遍历所有元素,然后计算面积,保留最大面积。

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        i,j = len(height)-1, 0
        m = 0
        while i>0:
            j=0
            while j<=i:
                if height[i] > height[j]:
                    m = max((i - j) * height[j], m)
                else:
                    m=max((i - j) * height[i], m)
                j+=1
            i-=1

        return m

结果:
超时

方法二:双指针操作

定义ij两个指针,分别指向首尾,在遍历的过程中计算面积。两线段之间形成的区域总是会受到其中较短那条长度的限制。此外,两线段距离越远,得到的面积就越大。

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        i,j = 0,len(height)-1
        m = 0
        while i<j:
            m = max(m, min(height[i], height[j])*(j-i))
            if height[i]<height[j]:
                i += 1
            else:
                j -= 1
        return m

结果:
执行用时 : 236 ms, 在Container With Most Water的Python提交中击败了7.53% 的用户
内存消耗 : 13 MB, 在Container With Most Water的Python提交中击败了31.82% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过236 ms13MBpython

   Reprint policy


《leetcode-11 | 盛最多水的容器 中等难度》 by 梦否 is licensed under a Creative Commons Attribution 4.0 International License
 Previous
leetcode-209 | 长度最小的子数组 leetcode-209 | 长度最小的子数组
209. 长度最小的子数组(Minimum Size Subarray Sum)给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。 Exam
2019-04-24
Next 
leetcode-345 | 反转字符串中的元音字母 leetcode-345 | 反转字符串中的元音字母
345. 反转字符串中的元音字母(Reverse Vowels of a String)编写一个函数,以字符串作为输入,反转该字符串中的元音字母。 示例1:输入: “hello”输出: “holle”示例2:输入: “leetcode”输
2019-04-24
  TOC