Leetcode刷题(第11题)——盛水最多的容器

一、题目描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)  (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
说明:你不能倾斜容器。

二、示例
Leetcode刷题(第11题)——盛水最多的容器_第1张图片

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

三、思路解析
本题我们采用双指针,第一个指针指向height的首部,第二个指针指向height的尾部。使用一个变量保存当前最大值。
如果左指针指向的height大于右指针指向的height, 此时应该将右指针减一:原因如果左大于右并且移动左,此时一定是减小的。
如果左指针指向的height小于右指针指向的height,此时应该将左指针减一:原因同上。
如果左右指针的height都相等,此时将左指针+1,或者右指针-1均可。
四、代码

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height) {
    let res = 0;
    let left = 0;
    let right = height.length - 1
    while (left <= right) {
        res = Math.max(res, (right - left) * Math.min(height[right], height[left]))
        if(height[left] < height[right]) {
            left++
        }else {
            right--
        }
    }
    return res
};

五、结果
Leetcode刷题(第11题)——盛水最多的容器_第2张图片
时间复杂度为O(n ^ 2), 空间复杂度为O(1)。

你可能感兴趣的:(面试算法,leetcode,javascript,面试)