leetcode 11. 盛最多水的容器

150 阅读1分钟

题目描述: leetcode-cn.com/problems/co…

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

  image.png

输入:[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 示例 3:

输入:height = [4,3,2,1,4] 输出:16 示例 4:

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

思路分析

  1. 左右两个指针,指向两边。
  2. 往中间收缩
  3. 收缩的时候判断条件:哪个木板短就舍弃哪边(对应的指针移动)

image.png

AC代码

第一种: brute force 主要是了解思路,应该不能AC

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height) {
    var min = Number.NEGATIVE_INFINITY;
    var max = min;
    //双层循环
    for (var i = 0; i < height.length - 1; i++) {
        for (var j = i + 1; j < height.length; j++) {
            // 获取最短的板子
            min = Math.min(height[j], height[i]);
            // 计算面积
            max = Math.max(max, min * (j - i));
        }
    }
    return max;
};

第二种: 双指针

var maxArea = function (height) {

    var max = 0;

    var left = 0, right = height.length - 1;
    while (left < right) {
        // 取短的木板
        var short = Math.min(height[left], height[right]);
        // 计算面积
        max = Math.max(max, short * (right - left))
        // 滑动窗口,收缩
        if (height[left] <= height[right]) {
            left++;
        } else {
            right--;
        }


    }
    return max;
};