11、盛最多水容器

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

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

先赋代码:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        rst=[]
        #rst[0]=height[0]    空list不能直接赋值
        #rst.append(height[0])  
        for i in range(len(height)-1):   # 嵌套for循环遍历,以求两两之间的面积
            for j in range(i+1,len(height)):
                temp=min(height[i],height[j])*(j-i)
                
                #if temp>rst[i]:
                #   rst.append(temp)
                rst.append(temp)
                    
        return  max(rst)

刚开始看到这个题的时候,第一时间想到遍历求最值的问题,直到读到题目最后也还是这个问题,不过如果降低时间/空间复杂度的话,我想就必须考虑distance的影响,当距离从最大值不断缩小的时候,两个数值所构成的面积必会趋于降低,最后判断这种减小的趋势能不能弥补distance并有所突破,具体实现起来肯定比第一种要复杂得多!
基于1:我采用的是使用嵌套for循环,用排列组合方式求得所有矩形的面积,并不断append到一个新的数组中,最后求得最大值,从时间复杂度考虑有n(n-1)/2种组合,而且使用了额外的空间,这无疑是最为愚蠢的办法,但是的确可以求得最佳值!
基于2:我参考了力扣大神之作,在控制distance不断缩短的循环下,通过自加/自减查看较长线段能不能取得最优值,因为在距离减小的情况下只可能线段较长的一方有可能取得最大值!,这样通过一次遍历就能找出最大值,而且不用开辟更多的数组空间!可谓是两全其美

附代码如下:

class Solution:
    def maxArea(self, height: 'List[int]') -> 'int':
        l = 0
        r = len(height) - 1
        maxs = 0
        while l < r:
            area = min(height[l], height[r]) * (r - l)
            maxs = max(maxs,area)
            if height[l] < height[r]:   # 向长线段方向移动,才有可能取最大值
                l += 1
            else:
                r -= 1
        return maxs

另外讲一下自己编程过程中遇到的问题:
对空数组添加元素:我想先给数组赋一个初值后面在比较,确定是否append

def maxArea(self, height: List[int]) -> int:
        rst=[]
        rst[0]=height[0]

后来报错:IndexError:list assignment index out of range因为空数组并未开辟任何空间,所以rst[0]本身就表述错误!

猜你喜欢

转载自blog.csdn.net/m0_37833142/article/details/88062696