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)。除了输入的数组外,只需要常数空间存储左右指针和最大容量。

总的来说,这是一个效率较高的解决方案,适用于大规模数据处理。通过移动左右指针来不断尝试和更新最大容量,直到找到最优解。