1. 问题背景与核心需求
这道题目来自力扣(LeetCode)热题100系列的第11题"盛最多水的容器",是算法面试中的经典问题。题目描述如下:给定一个长度为n的非负整数数组height,其中每个元素代表坐标轴上的一个点(i, height[i])。找出两个点与x轴构成的容器,使得容器能盛最多的水。
这个问题的实际应用场景非常广泛。比如在物流仓储中计算最大储水容量,在建筑设计中确定雨水收集系统的最佳配置,甚至在金融分析中寻找最佳买卖点等。理解这个问题的解法不仅能帮助我们掌握双指针技巧,更能培养对空间效率和算法优化的敏感度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与性能分析
2.1 直观的暴力解法
最直观的解法是使用双重循环遍历所有可能的线段组合,计算每个组合能容纳的水量,然后取最大值。具体实现如下:
python复制def maxArea_brute(height):
max_area = 0
n = len(height)
for i in range(n):
for j in range(i+1, n):
current_area = min(height[i], height[j]) * (j - i)
max_area = max(max_area, current_area)
return max_area
这种解法的时间复杂度是O(n²),空间复杂度是O(1)。对于小规模数据(n<1000)尚可接受,但当n达到10^5级别时,这种解法就会因为超时而被拒绝。
2.2 暴力解法的局限性分析
暴力解法的主要问题在于它重复计算了大量无效的组合。比如当height[i]很小时,所有以i为左边界的情况都不可能产生更大的面积,但暴力解法仍然会继续计算这些情况。这种低效性正是我们需要优化的地方。
3. 双指针优化解法
3.1 双指针的基本思路
更高效的解法是使用双指针技术。我们初始化两个指针分别指向数组的首尾,然后逐步向中间移动指针。具体步骤如下:
- 初始化左指针left=0,右指针right=len(height)-1
- 计算当前面积:area = min(height[left], height[right]
