1. 问题背景与理解
这道题目来自LeetCode第11题,属于经典的数组类算法问题。题目描述很简单:给定一个长度为n的非负整数数组height,每个元素代表坐标轴上的一个点(i, height[i])。我们需要找到两个点,使得它们与x轴构成的容器能容纳最多的水。
我第一次看到这个问题时,直觉上觉得应该找到最高的两个柱子。但仔细思考后发现这是个误区——容器的容量实际上由两个因素决定:宽度(两个柱子的距离)和高度(两个柱子中较矮的那个)。这就像我们生活中用木板围成水桶,水桶的容量取决于最短的那块木板。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法分析
2.1 直接思路实现
最直观的解法是暴力枚举所有可能的柱子对,计算每个组合的容量,然后取最大值。这种方法的时间复杂度是O(n²),在LeetCode上提交会导致超时,但对于理解问题很有帮助。
python复制def maxArea(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
2.2 暴力法的局限性
虽然暴力法简单直接,但当数组长度达到10⁵时,计算量会爆炸式增长。我在本地测试时发现,对于长度为10⁴的数组,暴力法需要约10秒才能完成计算,这显然无法满足算法竞赛的要求。
3. 双指针优化解法
3.1 算法思路突破
更高效的解法是使用双指针技巧。我们初始化两个指针分别指向数组的首尾,计算当前容量后,移动较矮的那个指针向中间靠拢。这个策略的正确性基于以下观察:
- 容器的容量受限于较矮的柱子
- 移动较高的柱子不会增加容量(因为高度不会增加,而宽度在减少)
- 移动较矮的柱子有可能遇到更高的柱子,从而可能增加容量
3.2 代码实现
python复制def maxArea(height):
left, right = 0, len(h
