给定 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
先赋代码:
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]本身就表述错误!