题目

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

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

img

输入:[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

提示:

  • n == height.length

  • 2 <= n <= 105

  • 0 <= height[i] <= 104

思考过程

看本题的标签有贪心算法,于是去了解了一下贪心算法:你每步都选择局部最优解,最终得到的就是全局最优解。

结合双指针,把两个指针放在两边,因为面积等于长和高(较小的那个),每次移动的时候长必定减一,而高将会变化,假设移动较高的,那么移动后面积一定不会变大,甚至变小(由较矮决定),但是移动较矮的,面积存在变大的可能,如此每一步选择局部最优解,最终得到的就是全局最优解。体现了贪心算法的思维

func maxArea(height []int) int {
    i := 0
    j := len(height) - 1
    t := 0
    max := 0
    for i != j{
         if height[i] < height[j]{
        t = height[i] * (j-i)
        if t > max{
            max = t
        }
        i++
        continue
    }
    t = height[j] * (j - i)
    if t > max{
        max = t
    }
    j--
    continue
    }
    return max
}

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐