1. 问题描述与直观理解
这道来自LeetCode的经典题目"盛最多水的容器"(Container With Most Water)描述如下:给定一个长度为n的非负整数数组height,其中每个元素代表垂直线上的一点高度。找出两条线,使得它们与x轴共同构成的容器可以容纳最多的水。
简单来说,就是在坐标平面上有若干根垂直于x轴的柱子,我们需要找到两根柱子,使得它们和x轴围成的矩形区域能够装下最多的水。注意这里的水量计算只考虑两根柱子之间的较短高度和它们之间的距离。
举个例子,给定数组[1,8,6,2,5,4,8,3,7],最左边高度1和最右边高度7的柱子形成的容器宽度为8(数组下标差),高度为min(1,7)=1,所以水量是8×1=8。而实际上这个数组的最大水量应该是49(高度7×宽度7)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与复杂度分析
2.1 直接枚举法
最直观的解法就是暴力枚举所有可能的柱子对,计算它们能容纳的水量,然后取最大值。这种方法简单直接,但效率低下。
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 时间复杂度分析
这个解法使用了双重循环,外层循环遍历n-1次,内层循环平均遍历n/2次,所以总的时间复杂度是O(n²)。对于LeetCode的测试用例来说,当n=10⁵时,这样的复杂度显然会超时。
注意:在实际面试中,虽然暴力解法不是最优解,但建议先提出这个解法,然后再优化。这展示了你的解题思路是从简单到复杂的过程。
3. 双指针优化解法
3.1 算法思路
更高效的解法是使用双指针技术。我们初始化两个指针,一个指向数组开头(left),一个指向数组末尾(right)。然后我们计算这两个指针指向的柱子能容纳的水量,并记录最大值。
关键
