返回
巧用数学技巧,在 LeetCode 11 轻松求解盛最多水的容器
前端
2023-12-26 03:06:51
问题
给你 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 上取得成功!