# 11 题盛最多水的容器

# 题目链接

# 难度:中等

# 思路分析:

双指针滑窗

#

#

#

#

#

#

#

#

#

#

#

#

#

#

# 代码:

暴力法

function maxArea(height) {
  const total = height.length;
  let max = 0;
  // 双循环 每个木板都跟其他木板匹配一次
  for (const i = 0; i < total; i++) {
    for (const j = 1; j < total; j++) {
      // 两个木板的高度
      const height1 = height[i];
      const height2 = height[j];
      // 获取最小高度
      const heightNum = height1 > height2 ? height2 : height1; // 取木板最小的那个值
      const lengthNum = j - i; // 底部的长度
      const size = heightNum * lengthNum; // 当前两块木板的面积
      if (size > max) {
        max = size; // 最大面积
      }
    }
  }
  return max;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

双指针: 滑窗

var maxArea = function(height) {
  let left = 0; //左下标
  let right = height.length - 1; //右下标
  let max = 0; //最大装水量
  while (left < right) {
    let now = (right - left) * Math.min(height[right], height[left]); // 当前水量
    max = now > max ? now : max; // 更新最大水量
    // 窗口缩小思路
    // 从数组左右两侧开始,判定两者的大小,以较小的一侧为滑动边界;
    // 如果滑动边界向内收缩一位的值比之前的值要小,那么继续滑动,这时候的面积肯定是逐渐减小的;
    // 当出现滑动边界的值比之前的大了,那么就需要重新判断下左右边界的大小,进行一次新的操作;
    // 最终会找到一个窗口的最大值 遍历一次 O(n)
    if (height[left] > height[right]) {
      right--;
    } else {
      left++;
    }
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 鼓励我一下:

觉得还不错的话,给我的项目点个star

# 点个Star支持我一下~

最后更新时间: 7/2/2020, 4:27:35 PM