LongDz 的数字文墨提案

11. 盛最多水的容器

3 min

题目

11. 盛最多水的容器 中等

思路

核心思想是使用双指针从数组两端向中间移动,每次移动高度较小的指针。

正确性证明:容器容量由较短的边和宽度共同决定。移动较短的指针可能遇到更高的边,从而弥补宽度减少的损失;而移动较长的指针时,新边高度不会超过原较短边(甚至可能更小),且宽度必然减少,因此不可能获得更大容量。

  • Step 1: 初始化左指针l=0,右指针r=n-1,计算初始面积
  • Step 2: 当l<r时循环,比较height[l]和height[r]
  • Step 3: 移动高度较小的指针(若相等则移动左指针)
  • Step 4: 每次移动后计算新面积并更新最大值
  • Step 5: 循环结束返回最大面积

复杂度

  • 时间复杂度: O(n)O(n),双指针仅遍历数组一次,比较操作为线性时间瓶颈。
  • 空间复杂度: O(1)O(1),仅使用固定数量的指针和变量,无额外空间消耗。

代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l = 0,r = height.size()-1;
        int area = min(height[l],height[r])*(r-l);
        while(l < r){
            if(height[l] > height[r]){
                r--;
            }
            else
            l++;
            area = max(min(height[l],height[r])*(r-l),area);
        }
        return area;
    }
};