1. 分析题目
给定一个整数数组height,长度为n,代表n条垂直线段,第i条线段的两个端点分别是(i, 0)和(i, height[i])。任务是找出两条线,这两条线与x轴一起形成一个容器,使得该容器能包含最多的水。要求返回容器能存储的最大水量,且容器不得倾斜。
2. 解释思路
本题采用双指针法解决。核心思想是在数组的两端各设置一个指针,计算当前两个指针对应的线段形成的容器的容量,然后移动其中一个指针来尝试找到一个更大的容器。
- 初始状态:左指针
l在数组的起始位置,右指针r在数组的末尾位置。 - 循环条件:只要左指针小于右指针,就继续遍历。
- 容量计算:容器的容量取决于较短的线段(因为水会从较短的那边溢出)和两个指针之间的距离。计算公式为
min(height[l], height[r]) * (r - l)。 - 移动指针:比较左右指针对应的线段高度,移动较短的那个指针,因为这样有可能在保持宽度尽可能大的同时,找到一个更高的线段,从而获得更大的容量。
3. 解释代码
class Solution:
def maxArea(self, height: List[int]) -> int:
l, r = 0, len(height) - 1 # 初始化左右指针
ans = 0 # 初始化最大容量
while l < r: # 当左指针小于右指针时
tmp = min(height[l], height[r]) * (r - l) # 计算当前容器的容量
ans = max(ans, tmp) # 更新最大容量
# 移动指针
if height[l] < height[r]:
l += 1 # 左边较短,移动左指针
else:
r -= 1 # 右边较短或相等,移动右指针
return ans # 返回最大容量
4. 分析空间复杂度和时间复杂度
- 时间复杂度:O(n)。双指针各从一端开始向中间移动,每个元素只被访问一次。
- 空间复杂度:O(1)。除了输入的数组外,只需要常数空间存储左右指针和最大容量。
总的来说,这是一个效率较高的解决方案,适用于大规模数据处理。通过移动左右指针来不断尝试和更新最大容量,直到找到最优解。

京公网安备 11010502036488号