返回

盛最多水的容器--揭秘木桶效应的数学奥秘!

前端

前言

众所周知,木桶盛水的最大容量取决于木桶最短的那块木板。这个原理被形象地称为木桶原理或短板效应。但在实际生活中,很多事情与木桶原理截然相反,这也引发了我的思考。

今天,我们就以LeetCode11 盛最多水的容器为题,来揭秘木桶效应背后的数学奥秘。

题目背景

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个竖直栅栏,栅栏 i 的高度为 ai。在栅栏之间,水可以被困住。求可以困住的最大水量。

解题思路

乍一看,这个问题似乎与木桶原理相似,但仔细分析后,我们发现,要想困住最多的水,我们需要关注的是最高的两块木板之间的距离,而不是最短的那块木板。

这个过程,就像是在用两个指针动态规划一样。我们从两端开始,逐渐向中间移动,每次都选择当前两端中较矮的那一块木板作为新的边界,并将较高的另一端向中间移动。

数学证明

为了证明这种方法的正确性,我们可以使用数学归纳法。

基本情况:

当 n = 2 时,显然,最高的两块木板之间的距离就是最大水量。

归纳假设:

假设对于 n < k,以上方法可以找到盛最多水的容器。

归纳步骤:

当 n = k 时,我们有两种情况:

  1. 左边木板较高:在这种情况下,我们可以将右边木板向中间移动,而左边木板的高度不变,显然,此时盛水量不会减少。

  2. 右边木板较高:同理,我们将左边木板向中间移动,右边木板的高度不变,盛水量也不会减少。

因此,在任何情况下,这种方法都可以找到盛最多水的容器。

算法实现

public int maxArea(int[] height) {
    int left = 0, right = height.length - 1, maxArea = 0;
    while (left < right) {
        maxArea = Math.max(maxArea, (right - left) * Math.min(height[left], height[right]));
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    return maxArea;
}

结语

通过对LeetCode11盛最多水的容器的分析,我们揭示了木桶效应背后的数学奥秘。同时,我们也学习了一种动态规划算法,可以帮助我们解决类似的问题。

希望这篇文章能够对你的算法学习有所帮助。如果您有任何问题或建议,请随时与我联系。