[LeetCode11题盛最多水的容器] | 刷题打卡

583 阅读3分钟

前言

今天上午写了一篇[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=0right=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 春招闯关活动」, 点击查看 活动详情