前言
今天上午写了一篇[LeetCode0304题二维区域和检索 - 矩阵不可变] | 刷题打卡的文章。为了能够用最简单明了的话来表达,真的是每一句都要想一下意思对不对、合理不合理,所以写的比较慢,但是也能让自己更清晰的理解,刚才看见掘金小姐姐发的建议题决定再写一篇😊!如果你觉得不错的话就点个赞吧❤️
题目描述
这题是LeetCode11题-盛最多水的容器,medium难度。
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例 1:
输入:[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
提示:
- n = height.length
- 2 <= n <= 3 * 10^4
- 0 <= height[i] <= 3 * 10^4
解题思路
题目给定一个数组height,要求数组内部能够盛最多水的容器,看到这个题有没有想起短板效应,水桶的最大容量是由最短的那块木板决定的(不要纠结什么斜着放之类的情况)。所以这个时候我们要想到用双指针来解决,left=0、right=height.length-1。
我们以示例1的数据为例:
双指针分别指向数组的左右两端,这个时候可以容纳的水量为Math.min(1, 7) * (right - left) = 8。
按照短板效应这个时候要移动最短的木板left++,这个时候可以容纳的水量为Math.min(8, 7) * (right - left) = 49。
这个时候我们可以得出:
res1 = Math.min(height[left], height[right]) * (right - left);
然后和上一次得到的水量相比取最大的,即:
res = Math.max(res, res1);
// 即为
res = Math.max(res, Math.min(height[left], height[right]) * (right - left));
这个时候这道题的解法不就很清晰明了了嘛!那就开始写解法代码吧!
解题代码
var maxArea = function(height) {
let left = 0, right = height.length - 1;
let res = 0;
while(left < right) {
res = Math.max(res, Math.min(height[left], height[right]) * (right - left))
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return res;
}
总结
这道题是一道经典的双指针题目,我们遇见这样的题不要怕,一定要微笑的面对它,写就完了。
加油,hxdm!!!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情