让我们一起啃算法----盛最多水的容器

栏目: IT技术 · 发布时间: 5年前

内容简介:题干如下:给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

盛最多水的容器(Container-With-Most-Water)

题干如下:

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

让我们一起啃算法----盛最多水的容器

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入:[1,8,6,2,5,4,8,3,7]

输出:49

来源:力扣

根据题意,将题目抽象为数学模型:给定一个 数组array两个索引X、Y ,在随意移动 X、Y 的过程中,求 S = |Y-X| * Min( array[X], array[Y] ) 的最大值,其中 Min( array[X], array[Y] ) 记为 H

  1. |Y-X| 表示索引差值的绝对值
  2. Min( array[X], array[Y] ) ,是因为在 |Y-X |固定的前提下,容器的纳水量完全取决于较小的高度,所以这边取 Min。

解题思路

我们将 X 指向数组的第一个位置Y 指向数组的最后一个位置 。按照上面的公式求出 S 的值并记录。判断 array[X] 和 array[Y] 的值,如果 array[X] > array[Y] 则 Y 向左移动,如果 array[X] < array[Y] 则 X 向右移动,如果 array[X] = array[Y] 则 X 向右移动,Y 向左移动 。总之,索引指向的元素值较小的移动,如果相等则一起移动。解释如下:

假设 X 指向的元素为 2,Y 指向的元素为 7。由于 2 比 7 小,所以 X 向右移。至于为什么不是 Y 向左移动是因为 H的值 是 array[X] 和 array[Y] 中较小的值,如果将 Y 向左移动,假设 array[Y-1] 比 array[X] 大,这时 H的值 仍为 array[X],而(Y - X)的值却变小了,因此 S 也变小了。假设 array[Y-1] 比 array[X] 小,这时 H的值 为 array[Y-1] ,较之前变小了,并且 (Y - X)的值也变小了,因此 S 也变小了。所以要移动元素值较小的索引。如果 array[X] 和 array[Y] 相等,则 X 和 Y 一起移动,分析过程与不相等一致。

流程图分析如下:

让我们一起啃算法----盛最多水的容器

代码实现

GO语言实现

func maxArea(height []int) int {
    var (
        i         = 0
        j         = len(height) - 1
        max       = 0
        minHeight = 0
    )

    for i < j {
        // H 的 计算
        if height[j] > height[i] {
            minHeight = height[i]
        } else {
            minHeight = height[j]
        }

        // 记录面积,也就是纳水量
        newMax := (j - i) * minHeight
        if newMax > max {
            max = newMax
        }

        // 移动高度小的指针,如果相等则一起移动
        if height[j] > height[i] {
            i++
        } else if height[j] < height[i] {
            j--
        } else {
            j--
            i++
        }
    }
    return max
}

思考

这题是我个人比较喜欢的,解题的过程很像自己在做职业规划时权衡利弊的模样。 H的值 好比职业技能的深度, |Y-X|的值 好比职业技能的广度, S的值 好比职场的价值,价值是由广度和深度一起决定的。有时候如果无法在深度上有提升,不必死磕,试试扩展一下广度。

总结

每天进步一点点,加油!

算法教程项目,每天更新一题,点个 star 支持一下呀:

https://github.com/wx-satellite/learning-algorithm

欢迎关注我们的微信公众号,每天学习 Go 知识

让我们一起啃算法----盛最多水的容器

以上所述就是小编给大家介绍的《让我们一起啃算法----盛最多水的容器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MySQL必知必会

MySQL必知必会

[英] Ben Forta / 刘晓霞、钟鸣 / 人民邮电出版社 / 2009-1 / 39.00元

《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通过重点突出的章节,条理清晰、系统而扼要地讲述了读者应该掌握的知识,使他们不经意间立刻功力大增。一起来看看 《MySQL必知必会》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具