LeetCode 11. 盛最多水的容器|Python 解法详解

CSDN 算法专题 · 双指针与滑动窗口 | 难度:中等

题目信息

题目描述

给定非负整数数组 height,每个元素表示一条竖线高度。选择两条线与 x 轴组成容器,返回能盛水的最大面积。

示例

输入:height = [1,8,6,2,5,4,8,3,7]
输出:49

约束

2 ≤ height.length ≤ 10⁵;0 ≤ height[i] ≤ 10⁴。

解题思路

核心观察

面积由较短边乘两边距离决定。双指针从最宽区间开始,每次移动较短边;移动较高边只会缩短宽度且短板不变,不可能得到更优结果。

推导与执行步骤

  1. 左右指针放在数组两端
  2. 计算当前面积并更新答案
  3. 移动高度较小的一侧
  4. 直到两指针相遇

为什么这个方法正确

算法始终围绕上述核心观察维护有效状态,并且每一步只排除已经能够证明不可能产生更优答案的情况。按照执行步骤处理后,所有可能影响答案的元素或节点都会被恰好检查,因此不会遗漏合法答案;状态更新又严格遵守题目约束,所以最终结果有效。

从边界看,空区间、单个元素、全部相同或完全不匹配等情况都会落入初始化条件或循环终止条件,不需要依赖未定义状态。实现时再重点检查下标、空节点和重复元素,即可保证算法在极端输入下仍然成立。

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]),不是较高者。

总结

这道题的关键是:面积由较短边乘两边距离决定。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

更多推荐