11. 盛最多水的容器

111 阅读1分钟

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法:
方法一:暴力法+剪枝

func maxArea(height []int) int {
    max := 0
    length := len(height)
    for i := 1; i < length ; i ++ {
        if max < height[i] * i {  // 剪枝
            for j := 0; j < i; j ++ {
                area := (i - j) * min(height[i], height[j])
                if area > max {
                    max = area
                }
            }
        }
    }

    return max
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

方法二: 双指针
以下代码找到这样一个关系:min(x,y')∗t' < min(x,y)∗t 用语言描述就是,如果将移动较高的轴,得到的面积始终小于当前面积,为了找到更大的面积,只能移动矮轴 其中x,y代表左右两个轴的高度,t横轴坐标宽度;y',t'表示将高度较高的轴移动之后的轴高度和横轴宽度。

func maxArea(height []int) int {
    max := 0
    length := len(height)
    l, r := 0, length - 1
    for l < r {
        area := min(height[l], height[r]) * (r - l)
        if area > max {
            max = area
        }
        if height[l] < height[r] {
            l ++
        } else {
            r --
        }
    }

    return max
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}