写点什么

【刷题第八天】11. 盛最多水的容器

作者:白日梦
  • 2022 年 5 月 14 日
  • 本文字数:802 字

    阅读完需:约 3 分钟

一、题目描述:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 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复制代码
复制代码

二、思路分析:

题目要求我们需要求得容纳最多水的方案,那么我们必须要有两条边,所以这是一个明显的双指针问题,左指针 left 初始值为 0 ,右指针 right 初始值为 length - 1

容纳水量 MaxCount = (right - left) * Math.min(height[left], height[right]) 要考虑短板效应,因此我们使用两指针中的最小值。

那么目前的问题就转化为双指针的移动问题。我们该移动哪一个那?

从我感觉来说,我首先选择移动高度较低的指针,通过上面的公式,我们可以发现当前的容纳水量是由两指针之间高度低的影响的。

当我们指针时,两跟指针的距离是变小的,如果我们再移动较高的那个指针,那么不论如何移动都不可能大于刚才的容纳水量。因此我初步决定移动较低的指针。

至于题解中的同时移动的情况,当时我竟然直接没想到。

三、AC 代码:

var maxArea = function(height) {    let  l = 0, r = height.length - 1;    let maxCount = 0;    while (l < r) {        maxCount = Math.max(maxCount, Math.min(height[l], height[r]) * (r - l))         if (height[l] <= height[r]) {                ++l;            }            else {                --r;            }    }    return maxCount};复制代码
复制代码

四、总结:

这个题目算近期完整 AC 的问题了,但其实也算是瞎猫碰到了死耗子,忘记考虑双指针同时移动的情况了,还好这个题目无需两个指针一起动。


发布于: 刚刚阅读数: 2
用户头像

白日梦

关注

还未添加个人签名 2022.03.10 加入

还未添加个人简介

评论

发布
暂无评论
【刷题第八天】11. 盛最多水的容器_5月月更_白日梦_InfoQ写作社区