leetcode 11. 盛最多水的容器
发布人:shili8
发布时间:2025-02-07 12:23
阅读次数:0
**盛最多水的容器**
给定一个由不同高度的柱子组成的场景,我们需要找到两个水平线之间能盛满最多水的容器。每个柱子的高度代表了该位置可以容纳的水量。
例如,如果我们有以下场景:
[1,8,6,2,5,4,8,3,7]
我们应该返回49,因为水平线在5 和6 处相交,盛满了最多水。
**解决方案**
这个问题可以使用双指针技术来解决。我们将两个指针分别放在列表的两端,然后向中间移动它们。当一个指针移动到另一个指针后方时,我们就知道该位置不能再盛满水了。
我们需要考虑以下几点:
* 当两个指针相遇或重叠时,我们应该停止移动其中一个指针。
* 每次移动指针时,我们都应该检查当前的盛水量是否比之前的最大盛水量大。如果是,我们就更新最大盛水量。
**代码**
def maxArea(height): """ :type height: List[int] :rtype: int """ # 初始化两个指针,分别放在列表的两端 left =0 right = 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# 测试用例height = [1,8,6,2,5,4,8,3,7] print(maxArea(height)) # 输出:49
**注释**
* 我们使用双指针技术来解决这个问题。两个指针分别放在列表的两端,然后向中间移动它们。
* 每次移动指针时,我们都应该检查当前的盛水量是否比之前的最大盛水量大。如果是,我们就更新最大盛水量。
* 当两个指针相遇或重叠时,我们就知道该位置不能再盛满水了。
**时间复杂度**
这个算法的时间复杂度为 O(n),其中 n 是列表的长度。我们只需要遍历列表一次,计算每个位置的盛水量,然后更新最大盛水量。
**空间复杂度**
这个算法的空间复杂度为 O(1),因为我们只使用了常数数量的额外空间来存储两个指针和最大盛水量。