给定一个正整数列表,对于列表中的每一个值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)
每次循环算出来的面积的大小都取决于短边(注:两条边的间距越大,面积越大),所以要计算更大的面积,只能找比短边更长的边