news 2026/7/5 6:27:34

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
盛最多水的容器 — 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 测试用例
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 6:27:18

WWDC 视频批量下载:一个 Swift 脚本搞定所有资源

文章目录WWDC 视频批量下载&#xff1a;一个 Swift 脚本搞定所有资源1、它解决什么问题2、支持下载什么3、怎么用4、1080p 视频的特殊情况5、注意事项WWDC 视频批量下载&#xff1a;一个 Swift 脚本搞定所有资源 每年 WWDC 结束&#xff0c;几百个 session 视频、PDF 文档、示…

作者头像 李华
网站建设 2026/7/5 6:27:02

Steam创意工坊下载终极指南:5分钟学会用WorkshopDL免费下载模组

Steam创意工坊下载终极指南&#xff1a;5分钟学会用WorkshopDL免费下载模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法下载Steam创意工坊模组而烦恼吗&#xff…

作者头像 李华
网站建设 2026/7/5 6:25:01

养好猫,趣闯关!《喵呜乐消消》承包你的碎片时间

各位铲屎官&#xff0c;大家好&#xff0c;还在找一款操作简单、画风治愈、不用下载的小游戏吗&#xff1f;今天给大家安利全新休闲小游戏 ——喵呜乐消消&#xff01;&#x1f3ae; 游玩地址&#xff08;点开即玩&#xff09;&#xff1a;https://mwlxx.qzz.io/index.html?in…

作者头像 李华
网站建设 2026/7/5 6:23:52

终极指南:3分钟掌握BetterNCM插件管理器,彻底改造网易云音乐

终极指南&#xff1a;3分钟掌握BetterNCM插件管理器&#xff0c;彻底改造网易云音乐 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 想要让平淡的网易云音乐播放器变得与众不同吗&…

作者头像 李华
网站建设 2026/7/5 6:22:49

ppInk屏幕标注工具:从新手到专家的完整Windows演示指南

ppInk屏幕标注工具&#xff1a;从新手到专家的完整Windows演示指南 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你是否曾在在线会议中手忙脚乱地寻找合适的标注工具&#xff1f;是否希望有一款简单易用、功能强大的免费软…

作者头像 李华
网站建设 2026/7/5 6:17:01

Deepin Boot Maker完全指南:5分钟制作专业启动盘的免费开源方案

Deepin Boot Maker完全指南&#xff1a;5分钟制作专业启动盘的免费开源方案 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker 你是否曾经因为制作启动盘失败而反复重装系统&#xff1f;是否在复杂的命令行工具面前望…

作者头像 李华