11.盛最多水的容器(二刷)

public int maxArea(int[] height) {
    // 初始化最大盛水量为0
    int res = 0;
    // 使用双指针,i从数组起始位置开始,j从数组末尾开始
    int i = 0;
    int j = height.length - 1;
    
    // 双指针向中间移动,直到相遇
    while (i < j) {
        // 计算当前双指针对应的容器的盛水量
        // 底边长度 = j - i,高度取两柱子中较矮的那个
        int area = (j - i) * Math.min(height[i], height[j]);
        // 更新最大盛水量
        res = Math.max(res, area);
        
        // 关键策略:移动较矮一侧的指针
        // 因为容器的盛水量由较矮的柱子决定,移动较高的柱子不会增加盛水量,
        // 而移动较矮的柱子可能遇到更高的柱子,从而提升整体盛水量
        if (height[i] < height[j]) {
            i++;  // 左指针右移,寻找更高的左柱子
        } else {
            j--;  // 右指针左移,寻找更高的右柱子
        }
    }
    
    // 返回遍历过程中找到的最大盛水量
    return res;
}
posted @ 2025-05-19 21:11  星星永远发着光  阅读(12)  评论(0)    收藏  举报