最简单粗暴的方法,两个for循环,遍历 n(n-1)/2 次,当然超时。。。
class Solution:
def maxArea(self, height: List[int]) -> int:
height_len=len(height)
water=0
for i in range(height_len):
for j in range(i+1,height_len):
temp=(j-i)*min(height[i],height[j])
if temp>water:
water=temp
return water
优化一下:当每次选择一个容器的左边界时,并不需要遍历计算之后每一条垂线充当右边界的情况。
假设某一时刻,water=W,选择容器的左边界索引为 i ,高度为 height[i] 。那么容器至少需要 W/height[i] 的宽度才有可能突破 W 的容量上限。代码如下👇
class Solution:
def maxArea(self, height: List[int]) -> int:
height_len=len(height)
water=0
for i in range(height_len):
# 判断当前左边界是否有高度,防止除数为0
if not height[i]:
continue
# 右边界索引的临界条件
DDL_i=i+ceil(water/height[i])
for j in range(DDL_i,height_len):
temp=(j-i)*min(height[i],height[j])
if temp>water:
water=temp
return water
最优做法:双指针
class Solution:
def maxArea(self, height: List[int]) -> int:
l, r = 0, len(height) - 1
ans = 0
while l < r:
area = min(height[l], height[r]) * (r - l)
ans = max(ans, area)
if height[l] <= height[r]:
l += 1
else:
r -= 1
return ans