# 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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 鼓励我一下:
觉得还不错的话,给我的项目点个star吧