【刷题第八天】11. 盛最多水的容器

76 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

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

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

说明:你不能倾斜容器。

示例1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49

示例2:

输入: height = [1,1]
输出: 1

二、思路分析:

题目要求我们需要求得容纳最多水的方案,那么我们必须要有两条边,所以这是一个明显的双指针问题,左指针 left 初始值为 0 ,右指针 right 初始值为 length - 1

容纳水量 MaxCount = (right - left) * Math.min(height[left], height[right]) 要考虑短板效应,因此我们使用两指针中的最小值。

那么目前的问题就转化为双指针的移动问题。我们该移动哪一个那?

从我感觉来说,我首先选择移动高度较低的指针,通过上面的公式,我们可以发现当前的容纳水量是由两指针之间高度低的影响的。

当我们指针时,两跟指针的距离是变小的,如果我们再移动较高的那个指针,那么不论如何移动都不可能大于刚才的容纳水量。因此我初步决定移动较低的指针。

至于题解中的同时移动的情况,当时我竟然直接没想到。

三、AC 代码:

var maxArea = function(height) {
    let  l = 0, r = height.length - 1;
    let maxCount = 0;
    while (l < r) {
        maxCount = Math.max(maxCount, Math.min(height[l], height[r]) * (r - l))
         if (height[l] <= height[r]) {
                ++l;
            }
            else {
                --r;
            }
    }
    return maxCount
};

四、总结:

这个题目算近期完整AC的问题了,但其实也算是瞎猫碰到了死耗子,忘记考虑双指针同时移动的情况了,还好这个题目无需两个指针一起动。