1. 问题背景与核心挑战
盛最多水的容器问题(Container With Most Water)是算法领域经典的数组类题目,在力扣平台编号为11。题目要求给定一个长度为n的非负整数数组height,每个元素代表垂直线的长度,找出两条线与x轴共同构成的容器可以容纳最多的水量。
这个问题的现实原型可以追溯到城市规划中的水库选址、建筑设计中雨水收集系统优化等实际工程场景。比如在山区修建水库时,需要在不同海拔高度的位置选择两个点作为堤坝,使得蓄水量最大化。
关键点:容器的水量由两个因素决定——容器宽度(两条线的间距)和容器高度(两条线中的较短者)。数学表达式为:面积 = min(height[i], height[j]) * (j - i)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与性能瓶颈
最直观的解法是暴力枚举所有可能的线对组合:
python复制def maxArea_brute(height):
max_area = 0
n = len(height)
for i in range(n):
for j in range(i+1, n):
area = min(height[i], height[j]) * (j - i)
max_area = max(max_area, area)
return max_area
这种方法的时间复杂度是O(n²),当n较大时(比如10^5量级),计算量会呈平方级增长。在力扣的测试用例中,这样的解法会导致超时(TLE),无法通过所有测试用例。
3. 双指针解法的精妙设计
3.1 基本思路与正确性证明
双指针解法将时间复杂度优化到O(n),其核心思想是:
- 初始化两个指针分别指向数组的首尾(i=0, j=n-1)
- 计算当前面积并更新最大值
- 移动较短边的指针向内收缩
- 重复步骤2-3直到指针相遇
python复制def maxArea(height):
i, j = 0, len(height) - 1
max_area = 0
while i < j:
area = min(height[i], height[j]) * (j - i)
