盛最多水的容器

167 阅读1分钟

题目

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

说明:你不能倾斜容器。

示例 1: 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.初始化:双指针indexS,indexE分列水槽左右两端;
2.循环收窄: 直至双指针相遇时跳出;
(1)更新面积最大值res
(2)选定两板高度中的短板,向中间收窄一格;
3.返回值:返回面积最大值res即可;

代码

const maxArea = function (height) {
  const len = height.length;
  let res = 0;
  let indexS = 0;
  let indexE = len - 1;
  while (indexS < indexE) {
    if (height[indexS] < height[indexE]) {
      res = Math.max(res, height[indexS] * (indexE - indexS));
      indexS++;
    } else {
      res = Math.max(res, height[indexE] * (indexE - indexS));
      indexE--;
    }
  }
  return res;
};

复杂度分析:
时间复杂度O(n):双指针遍历一次底边宽度n
空间复杂度O(1):变量len,indexS,indexE,res使用常数额外空间。