算法挑战34: 盛水最多的容器

3 阅读1分钟

题目:

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

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

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

说明: 你不能倾斜容器。

思路:

使用相向双指针

一个指向第一个元素left,一个指向最后一个元素right

不断缩小两个指针

怎么缩小呢?

如果left的高度小于right的高度,就移动left,因为再移动right的话,不论是大是小都是以最低的这个left的高度为边,而且宽度还变小了,所以容积不可能更大了

所以我们的规则就是,谁小动谁

代码:

var maxArea = function (height) {
    //相向双指针
    //如果
    let res = 0;
    let len = height.length;
    let l = 0;
    let r = len - 1;
    while (l < r) {
        //计算容器容积
        const capa = Math.min(height[l], height[r]) * (r - l) ;
        res = res > capa ? res : capa;
        if (height[l] < height[r]) {
            l++;
        } else {
            r--;
        }
    }
    return res;
};