1. 问题背景与核心需求
这道题目来自力扣(LeetCode)热题100系列,编号11题"盛最多水的容器"。作为一道经典的数组类算法题,它在技术面试中的出现频率相当高。题目描述很简单:给定一个长度为n的非负整数数组height,每个数代表坐标中的一个点的高度。你需要找出两个线,使得它们与x轴共同构成的容器可以容纳最多的水。
我第一次遇到这个问题是在准备算法面试的时候,当时觉得题目描述很简单,但真正动手写起来才发现有不少值得深究的地方。这道题之所以能成为经典,是因为它完美地展示了如何通过双指针技巧将O(n²)的暴力解法优化到O(n)的线性时间复杂度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与优化思路
2.1 直观的暴力解法
最直观的解法当然是暴力枚举所有可能的容器组合。对于n个元素,我们需要考虑C(n,2)=n(n-1)/2种可能的组合,计算每个组合能盛放的水量,然后取最大值。
水量的计算公式很简单:min(height[i], height[j]) * (j - i)。这个公式的意思是,容器的容量由两个因素决定:1) 两个挡板中较矮的那个高度;2) 两个挡板之间的距离。
暴力解法的代码实现也很直接:
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
这个解法的时间复杂度是O(n²),在n较大时(比如n=10^5)会非常慢,显然不是最优解。
2.2 双指针优化思路
仔细观察这个问题,我们会发现一些可以优化的特性。容器的容量由两个因素决定:宽度和高度。初始时,如果我们选择最左和最右的两个挡板,宽度是最大的。此时,如果我们想寻找可能更大的容量,就必须在高度上做文章。
这就是双指针法的核心思想:初始化时,左指针指向数组开头,右指针指向数组末尾。计算当前容量后,移动高度较小的那个指针(
