算法中怎么使用双指针技巧高效解决盛最多水的容器问题

轻瑶君_1165

轻瑶君_1165

2026-08-09

548人浏览

原创

必须从最宽开始,因为初始宽度最大且面积=宽度×较短边高度,只有先保证宽度最大,才可能获得全局最大值;每次只移动较短边指针,因移动较长边必然导致面积减小,而移动较短边有望提升短板高度从而增大面积;通过贪心剪枝确保不漏最优解。

算法中怎么使用双指针技巧高效解决盛最多水的容器问题

直接用双指针从两端向中间收缩,每次移动较短边的指针,就能在 O(n) 时间内找到最大盛水量。

为什么必须从最宽开始

容器面积 = 宽度 × 较短边高度。初始时左右指针分别在首尾,宽度最大。这是唯一可能取得全局最大值的起点——因为任何其他组合宽度都更小,除非高度显著提升,否则无法超越当前值。

  • 宽度随指针靠近持续减小,所以要争取在宽度尚大时,尽快找到更高的“短板”
  • 如果一开始就缩窄宽度,会永久丢失“最宽+中等高”这种潜在优解

为什么只移动较短边的指针

移动长边没有意义:宽度变小,而决定高度的仍是短边,新面积必然更小。

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • 假设 left 高度为 3,right 高度为 8,当前面积 = (j−i)×3
  • 若右移 right,新宽度减 1,新高度 ≤ 3(因为 left 还是短板),面积一定下降
  • 若右移 left,新宽度减 1,但新 left 高度可能为 5、7、9……只要 ≥ 3,就存在面积更大的可能

怎么保证不漏掉最优解

每轮舍弃的都是“已知不可能更好”的组合。例如当前 left=0, right=n−1,且 height[0] 较小,那么所有以 height[0] 为左边界、其他任意位置为右边界的容器,面积都不超过当前值。

  • 因为它们宽度 ≤ 当前宽度,且高度 ≤ height[0]
  • 所以这些组合全被安全剪枝,无需枚举
  • 算法本质是贪心+剪枝,不是穷举,但数学上可证明覆盖全部候选最优解

代码实现要点

只需两个变量维护指针和一个变量记录最大值,无额外空间开销。

  • 初始化 left=0,right=数组末尾索引
  • 循环条件是 left
  • 每次计算面积后,比较 height[left] 和 height[right],移动较小者
  • 注意整数乘法可能溢出,但题目数据范围(height[i]≤10⁴,n≤10⁵)下 int 足够

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

379

31

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

6656

4

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

2026.11.03

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习