盛最多水的容器

67 阅读2分钟

盛最多水的容器

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

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

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

说明: 你不能倾斜容器。

最近忙着搬家,没怎么做题,懒惰了。

这个说明,真是高估我了。可以倾斜容器,CPU真的要烧掉。

题目限制数组长度最小为 2,思路还是比较简单。我是一遍过,很难得,感觉真不错。

计算容量,长乘高就可以。长度取两坐标间距离,高度为两坐标对应数值较小(就像木桶短板理论一样)。

直觉上看,影响因素很多,会有一种无从下手的感觉,首先要减少因素。自然想到双指针,指向头尾。这样一开始,长度就是最大值,向中间搜索时,长度递减,只需要考虑数组上数值的影响。

移动指针时,如果移动的是数值较大的,不仅长度减少 1,高度最高也只会和上次一样(高度受限于较小值),容量减少。假设移动的是较小值,如果查找到更大值,虽然长度减 1,高度却增加了,容积可能上升。

这样就明白了,需要移动数值较小的指针,向中间查找更大值。移动一次后,还是一样的分析步骤,只需要重复之前的动作即可,直到走完数组中所有值,两指针重合。

function maxArea(height) {
    const len = height.length
    let left = 0, right = len - 1
    let max = 0
    while(left < right){
        // 计算最大值
        max = Math.max(max, calc(left, right))
        // 判断怎么移动指针
        if(height[left] <= height[right]) {
            left++
            continue
        }
        right--
    }
    return max
​
    function calc(i,j){
        const length = Math.abs(j - i)
        const width = Math.min(height[i], height[j])
        return length * width
    }
};