leetcode 11. 盛最多水的容器

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

11. 盛最多水的容器

给定一个长度为 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。

思路分析:

这道题其实和接雨水这道题有很大的相似之处,我们可以采用双指针的办法来解决这个问题,那么为什么会用到双指针呢,我们根据题目可以得知两条线是桶的木板,底部则是桶的宽度,我们可以想到桶的容积由最短的那块木板决定,而桶的容积还取决于底部的宽度,由于这个问题导致我们必须要遍历整个数组才能确定哪两个木板之间的容积是最大的,所以我们在遍历的同时可以记录下每一个木板它能存的最大水量。

但是如果我们采用循环遍历的方式来做的话,需要每个木板和其他所有木板都来配合一遍,这样会非常消耗性能,每一个木板它的最高容积其实就是它与最远且高于它本身木板的位置乘积,所以我们可以采用双指针的方式,分别从左右两边分别开始遍历,算出相对较小的一边然后乘以宽度就是当前木板最大容积了,然后我们采用移动较小木板,这样来保证算出来每个的容积都是最大容积,直到两边木板相遇得出的最大值就是当前最大容积

var maxArea = function(height) {
    let area = 0
    let left = 0
    let right = height.length-1
    while(left!==right){
        let data = Math.min(height[left],height[right])*(right-left)
        if(height[left]<height[right]){
            left++
        }else{
            right--
        }
        area = data>area?data:area
    }
    return area 
};