盛最多水的容器

Posted by zhouqian on Tuesday, July 26, 2022

力扣 11. 盛最多水的容器

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

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

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

说明:你不能倾斜容器。


方案一:双指针分别指向两侧边界,然后向内侧夹逼,统计最大值。

func maxArea(height []int) (ans int) {
    // 定义左右指针
    i, j := 0, len(height) - 1
    for i < j {
        // 计算容器的底和高
        bottom, top := j - i, min(height[i], height[j])
        // 计算最大值
        ans = max(ans, bottom * top)

        // 移动高度较低的指针,因为较低指针相对较高处的指针无法对后续移动计算最大盛水面积作出贡献
        if height[i] < height[j] {
            i++
        } else {
            j--
        }
    }
    return
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}
  • 时间复杂度:O(n),因为需要使用双指针向内侧夹逼,而双指针移动的总次数为 n(直到两个指针相遇才停止),所以时间复杂度为 O(n)。
  • 空间复杂度:O(1),因为常数级别的辅助变量,所以空间复杂度为 O(1)。