11. 盛最多水的容器

image

11. 盛最多水的容器

思路

要解决容器盛水问题,核心是最大化底边长度与最小高度的乘积。使用双指针策略:

  1. 双指针初始化:左指针在数组起始位置,右指针在数组末尾
  2. 指针移动规则:每次移动高度较小的指针(因为容器高度由较小值决定)
  3. 面积计算:当前面积 = 指针距离 × 较小高度
  4. 更新最大面积:遍历过程中记录最大面积

复杂度分析

  • 时间复杂度:O(n)
    双指针遍历整个数组一次
  • 空间复杂度:O(1)
    仅使用常数级额外空间

代码

class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int maxArea = 0;
        
        while (left < right) {
            // 计算当前容器面积
            int h = Math.min(height[left], height[right]);
            int w = right - left;
            maxArea = Math.max(maxArea, h * w);
            
            // 移动高度较小的指针(高度相等时移动任意一个)
            if (height[left] < height[right]) {
                left++;
            } else {
                // 当height[left] >= height[right]时(包含相等情况)
                right--;
            }
        }
        
        return maxArea;
    }
}

height[left] = height[right]时,随便一次移动都不会错过最大面积,情况如下:

  1. 当前是最大面积,不会错过
  2. 当前不是最大面积,随着遍历的进行,长度是减小的,那么中间肯定有至少两条更高的垂线,不管先移动哪侧的指针,最终都会有一侧先遍历到更高的垂线,等待另一次移动到更高的垂线计算出最大面积

posted @ 2025-07-28 01:41  quanht  阅读(11)  评论(0)    收藏  举报