「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给你 n
个非负整数 a1,a2,...,a``n
,每个数代表坐标中的一个点 (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 <= 105
0 <= height[i] <= 104
解题思路
- 这题我们使用双指针来做
- 我们定义两个指针,一个从前往后查找,另一个则相反从后往前也就是从两端向中心收缩
- 最大容量取决于容器的宽度(两指针的索引间隔)和短边的高度
- 当某指针所在边为较短边时,进行向中心收缩操作
- 这里我们解释一下为什么是移动较短边:当我们移动短边时,这条短边可能会变高从而使得容器的搞变大进而导致容积变大
- 反过来的话,因为容积由短边决定,移动长边的话高度不会变,也就是说容积不会改变
- 更新容积的最大值
- 最终我们将最大值也就是最多能容纳的水输出
解题代码
var maxArea = function(height) {
let maxArea = 0
for(let i =0,j = height.length-1;i<j;){
let minHight = height[i]<height[j]?height[i++]:height[j--]
maxArea = Math.max(maxArea,minHight*(j-i+1)) // 更新最大值
}
return maxArea
};
复制代码
如有任何问题或建议,欢迎留言讨论!