LeetCode 11. 盛最多水的容器|Python 解法详解
·
LeetCode 11. 盛最多水的容器|Python 解法详解
CSDN 算法专题 · 双指针与滑动窗口 | 难度:中等
题目信息
- 题号:11
- 难度:中等
- LeetCode:题目链接
题目描述
给定非负整数数组 height,每个元素表示一条竖线高度。选择两条线与 x 轴组成容器,返回能盛水的最大面积。
示例
输入:height = [1,8,6,2,5,4,8,3,7]
输出:49
约束
2 ≤ height.length ≤ 10⁵;0 ≤ height[i] ≤ 10⁴。
解题思路
核心观察
面积由较短边乘两边距离决定。双指针从最宽区间开始,每次移动较短边;移动较高边只会缩短宽度且短板不变,不可能得到更优结果。
推导与执行步骤
- 左右指针放在数组两端
- 计算当前面积并更新答案
- 移动高度较小的一侧
- 直到两指针相遇
为什么这个方法正确
算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。
从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。
Python 代码
# 解法核心:面积由较短边乘两边距离决定。双指针从最宽区间开始,每次移动较短边;移动较高边只会缩短宽度且短板不变,不可能得到更优结果。
# 实现步骤:
# 1. 左右指针放在数组两端
# 2. 计算当前面积并更新答案
# 3. 移动高度较小的一侧
# 4. 直到两指针相遇
def maxArea(height):
(left, right) = (0, len(height) - 1)
max_area = 0
while left < right:
current_area = min(height[left], height[right]) * (right - left)
max_area = max(max_area, current_area)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
易错点
面积高度取 min(height[left], height[right]),不是较高者。
总结
这道题的关键是:面积由较短边乘两边距离决定。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。
更多推荐
所有评论(0)