leetcode 第11题 (最大容器)

674 阅读1分钟

给定一个正整数列表,对于列表中的每一个值a,都能和该值的索引构成一个点,(i, a), 该点和(i,0)可以构成一个垂直线段, 求给定的列表中,能形成最大容器的两条线段(容器的最大面积以短的线段决定)


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

输出:49

形成最大面积的两条线段为( x=1 和 x=8),面积为(8 - 1) * min(8, 7) = 7 * 7 = 49


解法1: 最建大的DP

class Solution:
    def maxArea(self, height: List[int]) -> int:
        
        square = [0] * len(height)
    
        for i in range(len(height)):
            for k in range(i+1, len(height)):
                square[i] = max(square[i], (k-i) * min(height[i], height[k]))
        return max(square)


此解法的时间复杂度为O(n^2), 给定的列表个数足够大时,程序会超时


解法2: 

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


此解法的时间复杂度为O(n)

每次循环算出来的面积的大小都取决于短边(注:两条边的间距越大,面积越大),所以要计算更大的面积,只能找比短边更长的边