一、题目要求

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

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

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

说明:你不能倾斜容器。

二、解题思路

核心:双指针,用两个指针分别指向数组的两端,每次计算当前两条线围成的面积。

然后移动较矮的那一侧的指针(向内移动),因为:

  • 面积取决于较短的那条边宽度

  • 如果移动较长的边,宽度变小,但高度最多还是由较短的边决定,面积不可能增大

  • 而移动较短的边,虽然宽度变小,但高度有可能变大,面积可能增大。

所以,每次都移动较矮的一侧,保证不遗漏最优解,时间复杂度 O(n)。

三、代码

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    let left = 0;
    let right = height.length - 1;
    let maxWater = 0;

    while(left < right){
        const minHeight = Math.min(height[left],height[right]);
        const width = right - left;
        const water = minHeight * width;
        maxWater = Math.max(water,maxWater);

        if(height[left] < height[right]){
            left++;
        }else{
            right--;
        }
    }
    return maxWater
};

更多推荐