题目:
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例 2:
输入:height = [1,1]
输出:1
示例 3:
输入:height = [4,3,2,1,4]
输出:16
示例 4:
输入:height = [1,2,1]
输出:2
代码1:
原始想法,因为超出时间范围,无法正常提交。(时间复杂度超标)
优点:思路是遍历所有可能的组合,得出结果,取max值。简单易想到,代码也正确,空间复杂度也正常。
缺点:时间复杂度太高(双重循环)
class Solution:
def maxArea(self, height: List[int]) -> int:
maxx = 0
for i in range(1,len(height)):
for j in range(i):
temp = (i-j) * min(height[i], height[j])
maxx=max(temp,maxx)
return maxx
代码2:
常见算法思路,使用双指针,同时从头尾出发。可以正常提交。时间和空间复杂度都是O(N)。
优点:省时省地,代码也不难。
缺点:我没想到
class Solution:
def maxArea(self, height: List[int]) -> int:
maxx = 0
i,j=len(height)-1,0
while j<i:
temp = (i-j) * min(height[i], height[j])
maxx=max(temp,maxx)
if height[j]<height[i]:
j+=1
else:
i-=1
return maxx