返回

水量总是相亲相爱,围成湖泊躲一躲!

前端

一、题目

给你一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i]) 。这些线在 x 轴上是连续排列的。

我们希望找到两条垂线,它们之间的所有空间都被水填满。求可以容纳最多水的容器的面积。

例如:

  • 给定 height = [1, 8, 6, 2, 5, 4, 8, 3, 7],返回 49。
  • 给定 height = [1, 1],返回 1。

二、解题思路:双指针

本题乍看之下,似乎需要逐个计算每两个柱子之间的容积,再找出最大的容积。然而,我们可以采用更巧妙的解法——双指针

具体来说,我们可以使用两个指针 leftright ,分别指向数组 height 的最左端和最右端。我们从这两个方向向中间移动指针,不断计算两指针之间的容积。

leftright 相遇时,我们记录下最大容积。

我们来详细看看如何计算容积:

  • 如果 height[left] < height[right] ,那么容积由左指针指向的柱子 height[left] 决定。
  • 如果 height[left] >= height[right] ,那么容积由右指针指向的柱子 height[right] 决定。

为什么这样计算是正确的呢?

这是因为当 height[left] < height[right] 时,两指针之间的容积由较短的柱子 height[left] 决定,而较长的柱子 height[right] 会溢出水。同理,当 height[left] >= height[right] 时,两指针之间的容积由较短的柱子 height[right] 决定,而较长的柱子 height[left] 会溢出水。

三、代码实现:

def maxArea(height):
    """
    :type height: List[int]
    :rtype: int
    """
    left, right = 0, len(height) - 1
    max_area = 0

    while left < right:
        # 计算容积
        area = min(height[left], height[right]) * (right - left)
        # 更新最大容积
        max_area = max(max_area, area)

        # 移动指针
        if height[left] < height[right]:
            left += 1
        else:
            right -= 1

    return max_area

四、时间复杂度和空间复杂度

  • 时间复杂度:O(n),其中 n 是数组 height 的长度。
  • 空间复杂度:O(1),因为我们只使用了常数个变量。

五、结语

《盛最多水的容器》是一道经典的 LeetCode 算法题,它考验了我们对数组、双指针和容积计算的理解。通过这道题,我们不仅掌握了一种新的解题技巧,还对数据湖中的数据流动有了更深入的认识。

水滴总是相亲相爱,围成湖泊躲一躲。 让我们一起潜入数据湖的深处,探索更多有趣的算法世界!