题目描述:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

解法一:暴力枚举

class Solution {
    public int maxArea(int[] height) {
        int maxSum = 0;
        
        for(int i = 0; i < height.length; i++){
            for(int j = i+1; j < height.length; j++){
                int currentVolume = Volume(i, j, height);  // 只计算一次
                maxSum = Math.max(maxSum, currentVolume);
            }
        }
        return maxSum;
    }
    
    public int Volume(int front, int last, int[] height){
        // 简化:一行完成
        return Math.min(height[front], height[last]) * (last - front);
    }
}

解法二:双指针法

class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int maxArea = 0;
        
        while (left < right) {
            // 计算当前面积
            int width = right - left;
            int h = Math.min(height[left], height[right]);
            int currentArea = width * h;
            
            // 更新最大面积
            maxArea = Math.max(maxArea, currentArea);
            
            // 移动较矮的指针
            if (height[left] < height[right]) {
                left++;
            } else {
                right--;
            }
        }
        
        return maxArea;
    }
}

核心思想:贪心 + 双指针

关键洞察 💡

面积由两个因素决定

  1. 宽度:两条线之间的距离
  2. 高度:两条线中较短的那条(短板效应)

核心策略

从最大宽度开始,逐步收缩,每次移动较矮的那一边

为什么从两端开始?
  • 最大宽度:(两端距离最远)n - 1
  • 虽然宽度最大,但高度可能不是最优
  • 从这里开始有机会找到最优解

更多推荐