当前位置: 首页 > news >正文

盛最多水的容器 — AI 写了两版,第一版差点把面试官气走

读完本文你将了解:盛最多水容器的最优解法 | 从暴力到双指针的优化过程 | 面试中的表现要点


📋 题目

给定一个非负整数数组 height,每个元素代表坐标 (i, height[i]) 处的一条垂线。找出两条线,使它们与 x 轴共同构成的容器能够容纳最多的水。

项目说明
输入height = [1,8,6,2,5,4,8,3,7]
输出49
约束n == height.length,2 ≤ n ≤ 10⁵,0 ≤ height[i] ≤ 10⁴

💡 先问一个问题

这题在 LeetCode 上被点了 23 万次赞,排进 Top 50 热门题。看起来简单——不就是"找两个柱子,算面积"嘛——但 90% 的人第一次写的解法,放到 10⁵ 长度的数组上会直接跑死。

猜猜 AI 第一次会怎么写?

🤖 第一版:AI 的朴素解法(暴力枚举)

AI 遇到"找两个东西"的问题,第一反应永远是嵌套循环:

defmax_area(height):""" 暴力法:穷举所有柱子组合 """n=len(height)max_water=0foriinrange(n):forjinrange(i+1,n):h=min(height[i],height[j])w=j-i area=h*w max_water=max(max_water,area)returnmax_water

这版代码逻辑没问题。问题出在复杂度上:

时间复杂度:O(n²),空间复杂度:O(1)

放到一个 10⁵ 个元素的数组上,要执行约 50 亿次计算。不是"慢一点"的问题——是面试官直接喊停的水平。

不过暴力解给出了一个重要的观察:

面积 = min(左高度, 右高度) × (右下标 - 左下标)

这个公式告诉我们:面积受制于较短的那根柱子

🧠 AI 的自我优化

提示 AI "优化一下"后,它往往会经历一个思考过程:

第 1 次提示:思路转变

“既然面积受限于较短的那根,那我试试从两边往中间走?”

defmax_area(height):""" 两指针:从两端向中间移动 """left,right=0,len(height)-1max_water=0whileleft<right:h=min(height[left],height[right])w=right-left max_water=max(max_water,h*w)ifheight[left]<height[right]:left+=1else:right-=1returnmax_water

关键优化点:每次只移动较短的那端——因为面积受限于短板,移动长板不可能得到更大的面积。

时间复杂度:O(n),空间复杂度:O(1)

暴力枚举
O(n²)

双指针
O(n)

证明:移动短板
才可能增大面积

☕ Java 实现

publicintmaxArea(int[]height){intleft=0,right=height.length-1;intmaxWater=0;while(left<right){inth=Math.min(height[left],height[right]);intw=right-left;maxWater=Math.max(maxWater,h*w);if(height[left]<height[right]){left++;}else{right--;}}returnmaxWater;}

第 2 次提示:证明它

AI 不会只满足于"看起来对",继续追问后它会给出一个直观证明:

假设 left=0, right=n-1,且 height[left] < height[right]:

  • 如果移动 left(短板),新面积可能变大也可能变小
  • 如果移动 right(长板),新面积一定 ≤ 当前面积(宽变小了,高受限于依然不变的 left 短板)

结论:移动短板不一定变大,但移动长板一定不会变大。所以策略就是——谁短移谁。

左<右

左>=右

left < right

left >= right

开始
left=0, right=n-1

比较两端高度

左指针右移
left++

右指针左移
right--

计算面积
更新最大值

结束
返回最大面积

🔍 算法模式拆解

这道题属于Two Pointers(双指针)模式中的"相向双指针"子类。

适用场景:需要在一维数组中找两个元素,且满足某种约束条件时,尝试从两端向中间逼近。

核心特征:

  • 数组有一定顺序(不一定已排序)
  • 需要比较两个元素
  • 可以证明移动某一边不会丢失最优解

同类题:

  • 三数之和(Three Sum):固定一个指针,另外两个相向移动
  • 接雨水(Trapping Rain Water):双指针加强版,需要记录左右最大值

🏗️ 真实产品场景

这道题在产品环境中的威力,远比你在 LeetCode 上感受到的大。

场景一:物流中的最优路线规划

你在做物流调度系统,要从 A 地运一批货到 B 地。每个站点有不同的装卸能力(就是 height),你需要选两个站点之间的最优运输路径。运力受限于较小站点的处理能力(短板效应),而距离越远路线成本越高——完全就是"盛水容器"的问题变形。

实际中可能同时有几千个站点参与调度,O(n) 和 O(n²) 的差距——前者毫秒级出结果,后者等几分钟都可能行。

场景二:数据库连接池的并发分配

数据库连接数受限于最小节点的并发能力(短板),每个连接池的实例位置就是"下标"。分配连接时,策略同样是"找两个节点,使有效吞吐量最大化"——这就是双指针的活。

✅ 面试官的点评

维度合格线加分项
理解题意能说清面积公式明确指出"短板效应"
暴力解写出 O(n²)主动分析复杂度瓶颈
双指针写出双指针代码证明为什么移动短板才可能变大
边界情况处理 n=2测试全升序/全降序数组
扩展能引出"三数之和"同类题

常见踩坑:

  1. 只想着枚举,不提优化——面试官会问"还能更好吗?"
  2. 写双指针但说不清为什么是对的——能写对不代表理解透
  3. 忽略了大数溢出的可能性——如果 height 是 int 但面积用 int 存,可能溢出

📊 同类题推荐

  • 三数之和(LeetCode 15):双指针 + 排序,固定一个再移动两个
  • 接雨水(LeetCode 42):双指针进阶版,维护左右最大值的 trick
  • 有效三角形的个数(LeetCode 611):也是固定一个,双指针扫描

来源说明

  • ✅ 已验证:LeetCode 官方题解 + AI 实测
  • ✅ 代码已实测通过 LeetCode 测试用例
http://www.cnnetsun.cn/news/3154067.html

相关文章:

  • WWDC 视频批量下载:一个 Swift 脚本搞定所有资源
  • Steam创意工坊下载终极指南:5分钟学会用WorkshopDL免费下载模组
  • 养好猫,趣闯关!《喵呜乐消消》承包你的碎片时间
  • 终极指南:3分钟掌握BetterNCM插件管理器,彻底改造网易云音乐
  • ppInk屏幕标注工具:从新手到专家的完整Windows演示指南
  • Deepin Boot Maker完全指南:5分钟制作专业启动盘的免费开源方案
  • Beyond Compare 5永久激活终极指南:开源密钥生成器完整教程
  • Beyond Compare 5永久激活终极指南:开源密钥生成器完整使用教程
  • Locale-Emulator:智能解决Windows非Unicode程序区域兼容性难题
  • Android Keymaster/KeyMint:硬件级密钥管理与认证原理与NPI实践
  • 终极文档下载解决方案kill-doc:如何免费获取全网文档资源
  • 【信息科学与工程学】【制造工程】第三十四篇 3D TSV制造工程01
  • 3个步骤快速掌握Minecraft PCL启动器:终极免费解决方案
  • Topit:终极macOS窗口置顶解决方案,5分钟彻底告别窗口遮挡烦恼
  • StreamCap终极指南:3步掌握开源直播录制工具,轻松录制40+平台直播内容
  • B站缓存视频合并教程:3步将零散分段变成完整视频
  • 2026年6月GESP真题及题解(C++五级):晚宴
  • Bilibili-Old:现代化技术栈重构经典B站界面解决方案
  • 国产大模型价格战复盘 2024-2026:24 个月里,谁在裸泳,谁在赚安静的钱
  • 从零开始掌握ColabFold:让蛋白质结构预测变得触手可及
  • 告别网盘下载限速:9大主流平台直链下载终极解决方案
  • VMD 变分模态分解 Python 实战:3 个关键参数 (alpha, K, tau) 调优与信号重构误差分析
  • JWT令牌瘦身实战:5大策略实现50%体积压缩与性能优化
  • 微信好友关系检测终极指南:快速识别单向好友和拉黑关系
  • 星露谷物语模组终极指南:用SMAPI开启你的农场新世界
  • 终极指南:用Hearthstone-Script实现炉石传说自动化,每天节省1小时游戏时间
  • 《AI 术语中英对照手册(2026)》
  • 杭州汽车贴膜店实测排行TOP5,这家性价比绝了
  • VRoid Studio中文汉化完整指南:10分钟告别英文界面困扰
  • VRoid Studio中文汉化插件:3步解锁中文创作新世界