[路飞][LeetCode]11_盛最多水的容器

271 阅读2分钟

「这是我参与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
};

如有任何问题或建议,欢迎留言讨论!