问题:给定 n 条垂直线,找出两条线与 x 轴共同构成的容器可以容纳最多的水。

双指针解法思路:

  • left 指针从数组开头开始,right 指针从数组末尾开始

  • 计算当前容器的面积:min(height[left], height[right]) * (right - left)

  • 移动高度较小的指针(因为容器的盛水量由较短的边决定)

代码优化建议

c

int maxArea(int* height, int heightSize) {
    int left = 0;
    int right = heightSize - 1;
    int maxWater = 0;
    
    while (left < right) {
        // 直接计算宽度,避免中间变量
        int currentWater = (height[left] < height[right] ? height[left] : height[right]) * (right - left);
        
        if (currentWater > maxWater) {
            maxWater = currentWater;
        }
        
        // 移动较短的指针
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    
    return maxWater;
}

算法正确性证明

为什么移动较短指针的策略是正确的?

假设 height[left] < height[right]:

  • 如果移动 right,宽度减少,且高度不会超过 height[left],面积只会更小

  • 如果移动 left,虽然宽度减少,但可能找到更高的柱子,从而可能获得更大的面积

因此,总是移动较短指针的策略不会错过最优解。

时间复杂度:O(n)
空间复杂度:O(1)

更多推荐