LeetCode 热题 HOT 100(双指针)11. 盛最多水的容器

37 阅读2分钟

题目描述

11. 盛最多水的容器

中等

提示

给定一个长度为 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

 

提示:

  • n == height.length
  • 2 <= n <= 10^5
  • 0 <= height[i] <= 10^4

思路描述

容器最终的容积取决于短木板的高度,因此在记录当前容积后,试图增加短木板的高度才可能得到最大的盛水容器的容积。基于此,如果左边木板高度更大,那么下一次移动右侧的指针,否则就移动左边。

func maxArea(height []int) int {
    // 根据木桶原理,短边变大才能使容器的整体容积得到提升
    // 所以当确定一边更高时,试图让另一边变大才更容易得到盛更多水的容器
    var (
        l = 0
        r = len(height)-1
        area = 0
        max = 0
    )
    
    for l < r {
        leftHigher := isLeftBiggerThanRight(height[l], height[r])
        if leftHigher {
            area = height[r] * (r-l)
            r--
        } else {
            area = height[l] * (r-l)
            l++
        }
        if area > max {
            max = area
        }
    }
    return max
}

func isLeftBiggerThanRight(lHeight, rHeight int) bool {
    return lHeight > rHeight
}

claude 版本

func maxArea(height []int) int {
    var (
        l = 0
        r =  len(height) - 1
        max = 0
    )

    for l < r {
        // the area is determined by the shorter height
        minHeight := min(height[l], height[r])
        area := minHeight * (r - l)

        if area > max {
            max = area
        }

        // Move the pointer pointing to the shorter height
        // This is because moving the taller height pointer will only result int the 
        // same or smaller area
        if height[l] < height[r] {
            l++
        } else {
            r--
        }
    }
    return max
}

image.png