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

双指针系列第 8 篇:盛水最多的容器。几句话讲明白!

在这里插入图片描述

Leetcode 题目链接

思路

取首尾双指针和水量如下所示,设高度函数为 h ( i ) h(i) h(i),在下图中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)
Screenshot 2024-07-03 at 6.30.09 PM.png

观察以 l l l 为左边界所能构成的其他水量,与矮的右边界搭配结果如下。
Screenshot 2024-07-03 at 6.30.13 PM.png

与高的右边界搭配结果如下。
Screenshot 2024-07-03 at 6.30.15 PM.png

我们可以发现水量都会变小,即无法通过当前 l l l 获得更大的水量,可在记录水量后舍弃 l l l,使其右移。

如果初始 h ( l ) > h ( r ) h(l) > h(r) h(l)>h(r), 则镜像处理,令 r r r左移。

如果初始 h ( l ) = h ( r ) h(l) = h(r) h(l)=h(r),任意移动均可。

此后循环分析这个过程并移动指针即可。

严谨证明

假设初始 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r),当前可容纳的水量记为 c = ( r − l ) × h ( l ) c = (r - l) \times h(l) c=(rl)×h(l)

∀ i ∈ ( l , r ) \forall i \in (l, r) i(l,r) i i i l l l 作为边界对应的可容纳水量记为 c ′ = ( i − l ) × m i n { h ( i ) , h ( l ) } c' = (i - l) \times min\{h(i),\ h(l)\} c=(il)×min{h(i), h(l)},其中:

  • i − l < r − l i - l < r - l il<rl
  • m i n { h ( i ) , h ( l ) } ≤ h ( l ) min\{h(i),\ h(l)\} \leq h(l) min{h(i), h(l)}h(l)

c ′ < c c' < c c<c,可在记录水量后舍弃 l l l,令 l l l 右移,因为无法通过 l l l 获得更大的水量。

余下分析同上。

代码

仅提供 java 代码。

class Solution {public int maxArea(int[] height) {int l = 0;int r = height.length - 1;int maxCap = 0; // 待返回的最大水量while (l < r) {int cap = (r - l) * Math.min(height[l], height[r]);maxCap = Math.max(maxCap, cap);if (height[l] < height[r]) {l++;} else {r--;}}return maxCap;}
}

复杂度

时间: Θ ( n ) \Theta(n) Θ(n)
空间: Θ ( 1 ) \Theta(1) Θ(1)

推广

以下皆为个人所著,兼顾了职场面试和本硕阶段的学术考试。

  • 附个人题解的双指针题单
  • 图论入门
  • 图论进阶

点赞关注不迷路,祝各位早日上岸,飞黄腾达!

相关文章:

  • windows安装Gitblit还是Bonobo Git Server
  • spring-security安全框架(超精细版附带流程讲解图)
  • Patch embed 的映射矩阵多大?
  • redis的数据类型对应的使用场景
  • 快速了解GPT-4o和GPT-4区别
  • springboot在线考试系统-计算机毕业设计源码90381
  • android模糊背景的实现
  • 【论文阅读】--Popup-Plots: Warping Temporal Data Visualization
  • 不是大厂云用不起,而是五洛云更有性价比
  • 【前端VUE】VUE3第一节—vite创建vue3工程
  • 二叉树中序遍历-递归法详解-数据结构与算法
  • Qt/C++模拟鼠标键盘输入
  • 【ruoyi】docker 项目实战
  • 算法训练营day67
  • macOS 上或linux安装 Jenkins
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 0x05 Python数据分析,Anaconda八斩刀
  • 78. Subsets
  • Apache Pulsar 2.1 重磅发布
  • dva中组件的懒加载
  • JavaScript设计模式之工厂模式
  • jdbc就是这么简单
  • mongodb--安装和初步使用教程
  • MySQL几个简单SQL的优化
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • python_bomb----数据类型总结
  • python3 使用 asyncio 代替线程
  • Web标准制定过程
  • Zsh 开发指南(第十四篇 文件读写)
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $L^p$ 调和函数恒为零
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (笔试题)分解质因式
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (三)SvelteKit教程:layout 文件
  • (十六)一篇文章学会Java的常用API
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)平衡树
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ****三次握手和四次挥手
  • **python多态
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET DataGridView数据绑定说明
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 反射的使用
  • .NET关于 跳过SSL中遇到的问题
  • .NET建议使用的大小写命名原则