news 2026/9/16 8:29:39

【Hot100-Java中等】LeetCode 11. 盛最多水的容器:双指针法的直观理解与数学证明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Hot100-Java中等】LeetCode 11. 盛最多水的容器:双指针法的直观理解与数学证明

在 LeetCode 的Hot 100题单中,第 11 题“盛最多水的容器”是一道极具代表性的题目。它不仅考察编程技巧,更考察通过数学逻辑优化算法的能力。

这道题的暴力解法很容易想到,但要达到的最优复杂度,需要利用双指针技巧。今天我们就来深入剖析这道题。

1. 题目核心分析

题目描述:给定一个数组height,数组中的每个元素代表一条垂直线的长度。找出两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

核心公式

我们面临的是一个权衡问题:

  • 想要面积大,宽度(距离)要大。

  • 想要面积大,高度(短板)也要高。

    但因为木桶效应,容器的高度取决于两边较短的那条线。


2. 为什么暴力法不可行?

最直观的想法是两层for循环,枚举所有可能的组合(i, j),计算面积并取最大值。

  • 时间复杂度

  • 数据范围:题目提示

  • 结果的平方是,这远远超过了计算机 1 秒钟的处理能力(约次运算),会导致超时 (TLE)

因此,我们需要寻找一种线性时间 $O(N)$ 的解法。


3. 核心解法:双指针 (Double Pointer)

算法流程

我们采用“缩减搜索空间”的策略。

  1. 初始状态:定义两个指针,left指向数组开头,right指向数组结尾。此时宽度最大

  2. 计算面积:计算当前leftright围成的面积,更新最大值maxArea

  3. 移动策略(关键)

    • 如果height[left] < height[right]移动左指针(left++)。

    • 如果height[left] >= height[right]移动右指针(right--)。

    • 口诀谁短动谁。

  4. 终止条件:当leftright相遇时停止。

为什么是“谁短动谁”?(直观理解)

假设现在left处的线比right处的线短。

  • 如果不移动left(短板),而是移动right(长板)

    • 宽度:一定变小。

    • 高度:受限于left(短板)。无论right移过来的新线有多高,整个容器的高度绝不可能超过left的高度。如果新线比left还矮,高度甚至会更低。

    • 结论:宽度变小,高度不变或变小面积一定变小

这意味着,只要left是短板,这一轮以left为边界的所有情况(left和任意right的组合)中,最开始算的那次(最远距离)就是最大的。left已经没有利用价值了,所以我们丢弃left,尝试找一根更高的线。


4. 严谨的数学证明

如果你觉得直观理解不够严谨,我们来看一下数学推导。

假设当前左右指针分别为,且(左边是短板)。

当前的距离为

当前面积

证明:为什么要移动

我们要证明的是:在保留的情况下,无论 $R$ 向左移动到任何位置(),得到的面积一定小于等于

  1. 新的宽度,显然

  2. 新的高度

    • 因为高度由短板决定,所以恒成立。

  3. 新面积

    • 因为

    • 所以恒成立

结论:只要确定了是短板,那么右边任意一条线的组合,最大面积只能是当前算出来的这个。因此,我们可以安全地排除,去探索新的可能性。


5. 代码实现 (Java)

Java

class Solution { public int maxArea(int[] height) { // 定义双指针,分别指向头尾 int l = 0, r = height.length - 1; int ans = 0; while (l < r) { // 1. 计算当前面积 // 高度由短板决定 int currentHeight = Math.min(height[l], height[r]); // 宽度是索引差 int currentWidth = r - l; int area = currentHeight * currentWidth; // 2. 更新最大面积 ans = Math.max(ans, area); // 3. 移动策略:谁短动谁 // 移动短板是为了试图找到更高的板子,从而可能抵消宽度的减小 if (height[l] <= height[r]) { l++; } else { r--; } } return ans; } }

6. 复杂度分析

  • 时间复杂度:

    • 双指针lr总共遍历整个数组一次。每个元素最多被访问一次。

  • 空间复杂度:

    • 只需要存储l,r,ans等几个变量,不需要额外的数组空间。

7. 总结

LeetCode 11 题是贪心思想双指针结合的典范。

解决此题的关键在于打破“遍历所有组合”的思维定势,转而思考:什么情况下我们能确定一条边已经发挥了最大潜力,可以被安全地“丢弃”?

  • Wood Bucket Theory(木桶理论):短板决定容量。

  • 消去法:移动短板那一侧的指针,相当于排除了该短板与其他所有远端边组合的可能性,因为它们一定比当前面积小。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 0:31:42

Bebas Neue字体完全指南:从入门到精通的现代设计解决方案

Bebas Neue字体完全指南&#xff1a;从入门到精通的现代设计解决方案 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 在当今数字设计领域&#xff0c;一款优秀的字体往往能决定项目的视觉成败。Bebas Neue作为备…

作者头像 李华
网站建设 2026/9/15 12:25:55

SQL解析革命:告别跨数据库兼容性噩梦的终极方案

SQL解析革命&#xff1a;告别跨数据库兼容性噩梦的终极方案 【免费下载链接】JSqlParser JSQLParser/JSqlParser: 这是一个用于解析和执行SQL语句的Java库。适合用于需要解析和执行SQL语句的场景。特点&#xff1a;易于使用&#xff0c;支持多种数据库的SQL语句解析和执行&…

作者头像 李华
网站建设 2026/9/4 7:53:58

Venera漫画阅读器终极指南:一站式解决你的漫画管理烦恼

还在为手机里装了五六个漫画APP而烦恼吗&#xff1f;本地漫画格式不兼容、网络漫画资源分散、阅读体验参差不齐——这些问题在Venera漫画阅读器面前都将迎刃而解。作为一款基于Flutter开发的全平台开源应用&#xff0c;Venera重新定义了漫画阅读的标准&#xff0c;为你带来前所…

作者头像 李华
网站建设 2026/9/11 15:58:20

PyInstaller解包工具终极指南:轻松提取Python可执行文件

PyInstaller解包工具终极指南&#xff1a;轻松提取Python可执行文件 【免费下载链接】pyinstxtractor PyInstaller Extractor 项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor PyInstaller解包工具是一款专为解包PyInstaller打包的Python可执行文件而设计的…

作者头像 李华
网站建设 2026/9/7 9:32:33

Illustrator脚本革命:从重复劳动到创意主导的设计工作流变革

在深夜的设计工作室里&#xff0c;资深设计师李明正对着屏幕叹气。他需要为30个产品图更新价格标签&#xff0c;每个标签都要手动修改文本、调整位置、检查对齐。这样的重复性工作已经耗去了他整个下午&#xff0c;而真正的创意设计还等着他来完成。这不仅仅是李明一个人的困境…

作者头像 李华
网站建设 2026/9/12 11:07:14

音频格式转换工具:处理加密音乐文件的实用方法

音频格式转换工具&#xff1a;处理加密音乐文件的实用方法 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gitc…

作者头像 李华