返回
盛最多水的容器--揭秘木桶效应的数学奥秘!
前端
2023-09-30 23:03:26
前言
众所周知,木桶盛水的最大容量取决于木桶最短的那块木板。这个原理被形象地称为木桶原理或短板效应。但在实际生活中,很多事情与木桶原理截然相反,这也引发了我的思考。
今天,我们就以LeetCode11 盛最多水的容器为题,来揭秘木桶效应背后的数学奥秘。
题目背景
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个竖直栅栏,栅栏 i 的高度为 ai。在栅栏之间,水可以被困住。求可以困住的最大水量。
解题思路
乍一看,这个问题似乎与木桶原理相似,但仔细分析后,我们发现,要想困住最多的水,我们需要关注的是最高的两块木板之间的距离,而不是最短的那块木板。
这个过程,就像是在用两个指针动态规划一样。我们从两端开始,逐渐向中间移动,每次都选择当前两端中较矮的那一块木板作为新的边界,并将较高的另一端向中间移动。
数学证明
为了证明这种方法的正确性,我们可以使用数学归纳法。
基本情况:
当 n = 2 时,显然,最高的两块木板之间的距离就是最大水量。
归纳假设:
假设对于 n < k,以上方法可以找到盛最多水的容器。
归纳步骤:
当 n = k 时,我们有两种情况:
-
左边木板较高:在这种情况下,我们可以将右边木板向中间移动,而左边木板的高度不变,显然,此时盛水量不会减少。
-
右边木板较高:同理,我们将左边木板向中间移动,右边木板的高度不变,盛水量也不会减少。
因此,在任何情况下,这种方法都可以找到盛最多水的容器。
算法实现
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盛最多水的容器的分析,我们揭示了木桶效应背后的数学奥秘。同时,我们也学习了一种动态规划算法,可以帮助我们解决类似的问题。
希望这篇文章能够对你的算法学习有所帮助。如果您有任何问题或建议,请随时与我联系。