返回
水量总是相亲相爱,围成湖泊躲一躲!
前端
2024-01-20 03:27:38
一、题目
给你一个长度为 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。
二、解题思路:双指针
本题乍看之下,似乎需要逐个计算每两个柱子之间的容积,再找出最大的容积。然而,我们可以采用更巧妙的解法——双指针 。
具体来说,我们可以使用两个指针 left 和 right ,分别指向数组 height 的最左端和最右端。我们从这两个方向向中间移动指针,不断计算两指针之间的容积。
当 left 和 right 相遇时,我们记录下最大容积。
我们来详细看看如何计算容积:
- 如果 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 算法题,它考验了我们对数组、双指针和容积计算的理解。通过这道题,我们不仅掌握了一种新的解题技巧,还对数据湖中的数据流动有了更深入的认识。
水滴总是相亲相爱,围成湖泊躲一躲。 让我们一起潜入数据湖的深处,探索更多有趣的算法世界!