返回

巧用数学技巧,在 LeetCode 11 轻松求解盛最多水的容器

前端

问题

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器。

解决思路

这个问题看似复杂,但实际上可以通过一个简单的数学技巧来解决。我们可以将容器的容积表示为两个垂直线之间的面积。面积的最大值显然就是我们所要找的答案。

为了找到最大面积的容器,我们可以使用双指针的方法。我们将两个指针分别指向数组的第一个元素和最后一个元素。然后,我们将指针向内移动,并计算出当前指针所指向的两个元素之间的面积。如果面积大于我们之前找到的最大面积,那么我们就更新最大面积。

实现细节

使用双指针法,我们将从数组的两端开始,并逐步向中间移动。在每次移动时,我们会计算出当前指针所指向的两个元素之间的面积。如果面积大于我们之前找到的最大面积,那么我们就更新最大面积。

为了计算面积,我们可以使用以下公式:

面积 = min(a[left], a[right]) * (right - left)

其中,a[left] 和 a[right] 分别是两个指针所指向的元素,而 right - 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 是数组的长度。我们只需要遍历数组一次,因此时间复杂度是 O(n)。

空间复杂度:O(1),我们只需要几个变量来存储当前的最大面积和两个指针的位置,因此空间复杂度是 O(1)。

总结

通过使用双指针法和数学技巧,我们可以轻松解决 LeetCode 11 中的盛最多水的容器问题。这种方法简单易懂,而且具有很高的效率。希望这篇文章对您有所帮助,祝您在 LeetCode 上取得成功!