[ LeetCode优选算法专题一双指针-----盛最多的水]

1.题目链接

LeetCode盛最多的水

2.题目描述

3.题目解析 

问题本质分析

"盛最多水的容器" 问题可以抽象为:在坐标轴上有 n 条垂直线段,第 i 条线段的两个端点分别是 (i, 0) 和 (i, height [i])。找到两条线段,使得它们与 x 轴共同构成的容器能够容纳最多的水。

容器的容量计算公式是:面积 = 宽度 × 高度,其中:

  • 宽度 = 两条线段的横坐标之差
  • 高度 = 两条线段中较短那条的长度(因为水会从较短的一边溢出)

算法核心思路

采用双指针从两端向中间移动,通过贪心策略每次选择可能获得更大面积的移动方向:

  1. 初始状态:左指针在最左端 (left=0),右指针在最右端 (right=height.size ()-1)
  2. 计算当前面积:以当前双指针为边界计算容器面积
  3. 更新最大面积:如果当前面积大于历史最大值,则更新
  4. 移动指针
    • 若左指针指向的线段更短,移动左指针 (left++)
    • 否则,移动右指针 (right--)
  5. 终止条件:左右指针相遇 (left>= right)

 下面我们画图理解:

1.定义两个指针分别从左右两端开始,计算当前的V

2.接着开始移动指针 

如果移动right,L会减小,H也会减小,则V一定减小,所以没必要这么做. 

 

如果移动left,L会增大,H会减小,但V有可能增大 

为什么这样移动指针是正确的?

这是理解算法的关键。假设我们有两个指针 left 和 right,且 height [left] < height [right]:

  • 如果我们移动右指针,新的宽度一定减小(因为 right-left 变小)
  • 新的高度取决于新的 right' 和原 left 中的较小值,由于原 left 是较短的,新高度不会超过原高度
  • 因此,移动右指针只会得到更小的面积,不可能得到更大的面积

反之,如果 height [right] 更短,移动左指针也会导致面积减小。因此,只有移动较短的指针才有可能获得更大的面积,这是一种贪心策略的体现。

这种双指针解法的优势在于:

  • 时间效率高:只需遍历一次数组,O (n) 时间复杂度
  • 空间效率高:只使用常数级额外空间,O (1) 空间复杂度
  • 思路简洁:通过贪心策略每次做出局部最优选择,最终得到全局最优解

这个算法充分体现了贪心算法的思想 —— 通过每一步的局部最优选择,最终达到全局最优。

完整代码: 

 

代码注释: 

复杂度分析 

该双指针解法在时间和空间上都达到了最优:

  • 时间复杂度:O (n)(线性时间,遍历一次数组)
  • 空间复杂度:O (1)(常数空间,不依赖输入规模)

这也是该算法被认为是「盛最多水的容器」问题最优解的核心原因 —— 在保证正确性的前提下,实现了极高的效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91889.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旧笔记本电脑如何安装飞牛OS

01引言随着电子产品的更新换代&#xff0c;我们有很多的电子产品已经满足不了现在的工作需求和日常娱乐了&#xff0c;比如&#xff1a;用了很久厚重笔记本电脑放在现在办公也是有点吃力了&#xff0c;我们现在换新了旧的还不想放在那里吃灰&#xff0c;怎么办呢&#xff1f;我…

某金服Java面试终极指南:25题完整解析与场景化方案

涵盖分布式锁、缓存、事务、高并发等金融系统核心考点&#xff0c;附解决方案与抗风险设计一、分布式锁深度解决方案 1. Redis分布式锁完整实现 // 原子加锁 防死锁 String uuid UUID.randomUUID().toString(); Boolean locked redisTemplate.opsForValue().setIfAbsent(&qu…

MATLAB 2025a的下载以及安装,安装X310的测试附加功能(附加安装包)

首先将安装包下载到本地中之后解压该文件夹&#xff0c;打开文件发现有两个文件&#xff0c;其中crach文件夹中是破解matlab所用到的文件。而另一个压缩包就是需要安装的文件&#xff0c;要先解压在安装。在安装之前将网络断开&#xff0c;不然可能破解不成功&#xff0c;先进入…

Scala实用编程(附电子书资料)

概述 Scala 是一种多范式编程语言&#xff0c;结合了面向对象编程&#xff08;OOP&#xff09;和函数式编程&#xff08;FP&#xff09;的特性电子书资料&#xff1a;https://pan.quark.cn/s/88737d4a680d Scala 的核心特点多范式融合 既支持面向对象编程&#xff08;类、继承、…

数据结构(8)双向链表

目录 一、概念与结构 二、双向链表的实现 1、初始化 2、尾插 3、头插 4、尾删 5、头删 6、在指定位置之后插入结点 7、删除指定位置的结点 三、完整参考代码 一、概念与结构 这里的双向链表是指带头的的双向循环链表&#xff0c;这里的“带头”和之前所说的“头结…

【DeepSeek-R1 】分词系统架构解析

文章目录 🧩前言 🔍 1. SentencePiece Unigram 的核心原理 1.1 算法基础框架 1.2 核心数学原理 1.3 与BPE/WordPiece的对比 ⚙️ 2. DeepSeek-R1 分词器实现细节 2.1 词表结构设计 2.2 关键特性实现 📊 3. 性能优化关键技术 3.1 加速策略对比 3.2 编码过程伪代码 🔬 4.…

Linux自主实现shell

以下是在Linux操作系统 centos7版本下实现的shell &#xff0c;该shell具备bash的基础功能&#xff0c;无上下键输入历史命令功能&#xff0c;删除字符或命令时按住Ctrl Back #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.…

vue+elementUI上传图片至七牛云组件封装及循环使用

1.效果&#xff08;解决循环组件赋值问题&#xff09; 废话不多说直接上代码 2.下载七牛云依赖 npm install qiniu-js # 或者使用 yarn yarn add qiniu-js3.在vue组件中引入 import * as qiniu from qiniu-js4.在components文件夹下创建UploadImg1/uploadImg.vue组件 <templ…

2025年6月电子学会青少年软件编程(C语言)等级考试试卷(一级)

答案和更多内容请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> C/C ----> 一级】 网站链接 青少年软件编程历年真题模拟题实时更新 一、编程题 第 1 题 希望如光 题目描述 在充满挑战的生活中&#xff0c;希望往往是支撑人们穿越黑暗的核心力量。这…

拒绝复杂,AI图表制作简单化

在信息爆炸的时代&#xff0c;数据可视化已成为传递信息的核心手段。无论是职场汇报中的业绩分析&#xff0c;还是学术研究里的实验数据呈现&#xff0c;一张清晰直观的图表往往能胜过千言万语。而 AI 技术的介入&#xff0c;彻底改变了图表制作的传统模式 —— 它不仅让零基础…

easypoi生成多个sheet的动态表头的实现

在使用 EasyPOI 导出 Excel 时&#xff0c;生成多个 Sheet 且每个 Sheet 的表头是动态的&#xff08;即每个 Sheet 的列数和列名可能不同&#xff09;&#xff0c;可以通过如下方式实现&#xff1a;✅ 实现原理简述 使用 Workbook workbook ExcelExportUtil.exportExcel(expor…

移除链表元素+反转链表+链表的中间节点+合并两个有序链表+环形链表约瑟夫问题+分割链表

一、移除链表元素 给你一个链表的头节点 phead 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 (列表中的节点数目在范围 [0, 104] 内) 示例&#xff1a;输入&#xff1a;head [1,2,6,3,4,5,6], val 6 …

vue3+arcgisAPI4示例:轨迹点模拟移动(附源码下载)

demo源码运行环境以及配置运行环境&#xff1a;依赖Node安装环境&#xff0c;需要安装Node。 运行工具&#xff1a;vscode或者其他工具。 配置方式&#xff1a;下载demo源码&#xff0c;vscode打开&#xff0c;然后顺序执行以下命令&#xff1a; &#xff08;1&#xff09;下载…

Design Compiler:Milkyway库的创建与使用

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 DC Ultra推出了拓扑模式&#xff0c;在综合时会对标准单元进行粗布局(Coarse Placement)并使用虚拟布线(Virtual Routing)技术计算互联延迟&#xff0c;关于拓…

嵌入式教学的云端革命:高精度仿真如何重塑倒车雷达实验与工程教育——深圳航天科技创新研究院赋能新一代虚实融合实训平台

一、嵌入式教学的困境与破局之道 在传统嵌入式系统教学中&#xff0c;硬件依赖始终是核心痛点。以“倒车雷达实验”为例&#xff0c;学生需操作STM32开发板、超声波传感器、蜂鸣器等硬件&#xff0c;面临设备损耗、接线错误、调试效率低等问题。更关键的是&#xff0c;物理硬件…

flutter-boilerplate-project 学习笔记

项目地址&#xff1a; https://github.com/zubairehman/flutter_boilerplate_project/tree/master 样板包含创建新库或项目所需的最小实现。存储库代码预加载了一些基本组件&#xff0c;例如基本应用程序架构、应用程序主题、常量和创建新项目所需的依赖项。通过使用样板代码…

集成电路学习:什么是CMSIS微控制器软件接口标准

CMSIS,即Cortex Microcontroller Software Interface Standard(Cortex微控制器软件接口标准),是由ARM公司与多家不同的芯片和软件供应商紧密合作定义的一个标准。该标准旨在为基于ARM Cortex处理器的微控制器提供一套与供应商无关的硬件抽象层,从而简化软件的开发、重用,…

由浅入深使用LangGraph创建一个Agent工作流

创建一个简单的工作流&#xff1a;Start ——> 节点1(固定输入输出) ——> Endfrom langchain_core.messages import SystemMessage, HumanMessage, AIMessage from langgraph.graph import StateGraph, START, END from typing_extensions import TypedDict from typing…

PL-0功能拓展及基于VSCode的IDE配置

title: PL/0功能拓展及基于VSCode的IDE配置 date: 2024-08-06 22:46:38 tags: 做过的实验||项目复盘 top: true 概述PL/0语言可以看成PASCAL语言的子集,它的编译程序是由C语言编写的编译解释执行系统。PL/0能充分展示高级语言的最基本成分。拓展了pl0语言的基础功能&#xff08…

【低空经济】大型露天矿区安全生产无人机巡查与管理系统设计

1. 引言 大型露天矿区因其广阔的作业区域和复杂的环境条件&#xff0c;安全生产管理面临着严峻的挑战。随着科技的进步&#xff0c;无人机作为一种现代化的巡查工具&#xff0c;逐渐被应用于矿区的安全生产管理中。无人机具备高效、灵活、成本相对低廉等优点&#xff0c;可以在…