本文详细讲解LeetCode 第 11 题「盛最多水的容器」的解题思路与实现重点介绍双指针法的核心逻辑并提供可直接提交的C 正确代码。一、题目理解给定一个整数数组height其中每个元素代表一根垂线的高度。请找出两根垂线使其与 x 轴共同构成一个容器使得容器能容纳最多的水。核心公式容量 最短高度 × 两线距离即area min(height[left], height[right]) * (right - left)示例输入height [1,8,6,2,5,4,8,3,7]输出49解释线 8 和 7 构成的容器面积最大7 × 7 49。二、核心思路双指针法兼顾高度与距离本题的关键是在“距离”和“高度”之间寻找平衡。1. 为什么选择双指针最远距离初始时左右指针分别在两端距离最大。最大高度移动较矮的指针才有可能找到更高的高度从而增大面积。效率O(n) 时间复杂度仅遍历一次数组。2. 双指针逻辑left 0最左端right height.size() - 1最右端计算当前面积min(height[left], height[right]) * (right - left)更新最大面积移动较矮的一侧指针因为移动高指针无法提升面积直到left right结束三、完整 C 代码可直接提交#includevector#includealgorithmusingnamespacestd;classSolution{public:intmaxArea(vectorintheight){intleft0;intrightheight.size()-1;longlongmax_s0;while(leftright){inthmin(height[left],height[right]);intdright-left;// 强制转换为 long long 防止整数溢出longlongcur_s(longlong)h*d;if(cur_smax_s){max_scur_s;}// 移动较矮的指针if(height[left]height[right]){left;}else{right--;}}return(int)max_s;}};四、代码详解1. 指针初始化left从数组最左端开始right从数组最右端开始2. 计算面积longlongcur_s(longlong)h*d;h为最短高度d为两线距离必须强制转换为 long long防止溢出因为 int × int 可能超过 2^31-13. 指针移动策略若height[left] height[right]left若height[left] height[right]right--原因移动较矮的指针才有可能找到更高的高度从而提升面积移动高指针只会减小距离且最短高度不变面积必然减小。五、复杂度分析时间复杂度O(n)仅遍历一次数组每个元素最多被访问一次。空间复杂度O(1)仅使用了常数级额外空间。六、总结本题的最优解法是双指针法核心逻辑为初始左右指针分别在数组两端计算当前面积并更新最大值移动较矮的一侧指针直到指针相遇该方法时间复杂度为 O(n)空间复杂度为 O(1)是本题的最优解。