专题1 - 双指针 - leetcode 11. 盛最多水的容器

leetcode 11. 盛最多水的容器

  • 1. leetcode 11. 盛最多水的容器
    • 1. 题目详情
      • 1. 原题链接
      • 2. 基础框架
    • 2. 解题思路
      • 1. 题目分析
      • 2. 算法原理
      • 3. 时间复杂度
    • 3. 代码实现
    • 4. 知识与收获

在这里插入图片描述

1. leetcode 11. 盛最多水的容器

1. 题目详情

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。
在这里插入图片描述

示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:
输入:height = [1,1]
输出:1

提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104

1. 原题链接

leetcode 11. 盛最多水的容器

2. 基础框架

● Cpp代码框架

class Solution {
public:int maxArea(vector<int>& height) {}
};

2. 解题思路

1. 题目分析

( 1 ) (1) (1) 题目要求的是水池的最大容积

2. 算法原理

( 1 ) (1) (1) 首先会想到使用暴力解法,使用两层for循环枚举出所有的情况,找出最大水的容积。但是时间复杂度 O ( n 2 ) O(n^2) O(n2)题目不给过,需要找规律优化效率。

( 2 ) (2) (2) 使用对撞双指针算法:指针left指向数组第一个元素,指针right指向数组最后一个元素;此时容积可表示为 v = ( r i g h t − l e f t ) ∗ m i n ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) v=(right - left) * min(height[left], height[right]) v=(rightleft)min(height[left],height[right])
( 3 ) (3) (3) 假设初始时 h e i g h t [ l e f t ] < h e i g h t [ r i g h t ] height[left] < height[right] height[left]<height[right]:我们们的目的是找出水的最大容积 v v v。首先不管是 l e f t left left往左移动,还是 r i g h t right right往右移动, ( r i g h t − l e f t ) (right - left) (rightleft)一定是减小的;
当前 h e i g h t height height较小的是 h e i g h t [ l e f t ] height[left] height[left],那么如何确定是 l e f t left left向右移动还是 r i g h t right right向左移动呢?

( 4 ) (4) (4) 假设是 l e f t left left向右移动(right不变):对于移动后的最小 h e i g h t height height就有两种情况:
1.left移动后的 h e i g h t height height<=原先的 h e i g h t height height,此时 m i n ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) min(height[left],height[right]) min(height[left],height[right])是不变或减小的,那么 v v v一定是减小的;
2.left移动后height>原先的 h e i g h t height height,此时 m i n ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) min(height[left], height[right]) min(height[left],height[right])是增大的(增大之后也不会超过 h e i g h t [ r i g h t ] height[right] height[right],因为是选择较小的 h e i g h t height height计算),那么 v v v就可能是增大的。

( 5 ) (5) (5) 假设是 r i g h t right right向左移动(left不变):移动之后 h e i g h t [ r i g h t ] height[right] height[right]不管是增大、不变、还是减小, m i n ( h e i g h t [ l e f t , h e i g h t [ r i g h t ] ) min(height[left,height[right]) min(height[left,height[right])的值均不超过移动之前的值,即 v v v一定是减小的。

( 6 ) (6) (6) 综上,移动 h e i g h t height height较大的一方时, v v v不会超过当前的值;移动 h e i g h t height height较小的一方才可能得到更大的 v v v

3. 时间复杂度

O ( n ) O(n) O(n)

左右双指针 l e f t left left r i g h t right right对撞而走,直到相遇结束,最终共同遍历了一遍整个数组。

3. 代码实现

class Solution {
public:int maxArea(vector<int>& height) {// v = s * hint l = 0, r = height.size() - 1;int maxWater = 0;while(l < r){int v = (r - l) * min(height[l], height[r]);maxWater = max(maxWater, v);if(height[l] > height[r]){r--;}else{l++;}}return maxWater;}
};

4. 知识与收获

( 1 ) (1) (1) 双指针是非常优秀的一种算法,常常使算法时间复杂度降低一维。
( 2 ) (2) (2) 常使用的有两种形式:
对撞双指针,常见于数组中,核心思想来自快排。左指针left指向起始元素,右指针right指向最后一个元素。在循环中判断某些条件让左指针left向右移动,右指针right向左移动,直到leftright相遇停下来。
快慢双指针,又叫龟兔赛跑法,常见于数组、链表中,典例就是判断链表是否有环。定义快慢指针slowfast,通过让快慢指针分别以不同的速度移动来达到我们的目的。一般是快指针fast一次走多步,慢指针slow一次走一步。
( 3 ) (3) (3) 双指针算法是一种思想,不局限于数组或链表。双指针不一定非要是定义两个指针,也可以是下标。


T h e The The E n d End End

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

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

相关文章

分享一波非标设计资源合集

01 非标电表箱柜 本项目为创博智慧云产业研发中心的非标配电箱、电表箱设计原理图&#xff0c;地块一层含dwg图纸一份&#xff0c;包括配电箱壳体尺寸、原理图、接线图等20多种设计图纸。 02 住宅楼高压 低压 非标箱原理和箱体图 本图纸为高级住宅小区高低压非标箱设计原理…

Unity:Animation 三 Playable、ImportModel

目录​​​​​​​ 1. Playables API 1.1 Playable vs Animation 1.2 Advantages of using the Playables API 1.3 PlayableGraph Visualizer 2. Creating models outside of Unity 2.1 Preparing your model files for export 2.1.1 Scaling factors 2.1.2 优化模型文…

开源文生图大模型Playground v2.5发布:超越SD、DALL·E 3和 Midjourney

前言 在AI技术迅速发展的今天&#xff0c;文生图模型成为了艺术创作、设计创新等领域的重要工具。Playground v2.5的发布&#xff0c;不仅在技术上取得了突破&#xff0c;更在开源文化的推广与实践上迈出了重要一步。 Huggingface模型下载&#xff1a;https://huggingface.co/…

图论练习5

Going Home Here 解题思路 模板 二分图最优匹配&#xff0c;前提是有完美匹配&#xff08;即存在一一配对&#xff09;左右集合分别有顶标&#xff0c;当时&#xff0c;为有效边&#xff0c;即选中初始对于左集合每个点&#xff0c;选择其连边中最优的&#xff0c;然后对于每…

Sqli-labs靶场第18关详解[Sqli-labs-less-18]自动化注入-SQLmap工具注入

Sqli-labs-Less-18 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了User Agent&#xff0c;设想如果在User Agent尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会…

Unity中关于继承ScriptableObject的类

在游戏中我们会经常看到一些.asset的配置文件&#xff0c;而这些文件就是用一个自定义的类去继承ScriptableObject来生成的。比如当前有一些零散特效需要预加载&#xff0c;这个时候我们可以声明一个类去保存这些零散特效对象的信息&#xff0c;然后统一读取加载。 代码&#…

JavaScript极速入门(1)

初识JavaScript JavaScript是什么 JavaScript(简称JS),是一个脚本语言,解释型或者即时编译型语言.虽然它是作为开发Web页面的脚本语言而著名,但是也应用到了很多非浏览器的环境中. 看似这门语言叫JavaScript,其实在最初发明之初,这门语言的名字其实是在蹭Java的热度,实际上和…

【LeetCode】876_链表的中间结点_C

题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 示例 提示&#xff1a; 链表的结点数范围是 [1, 100]1 <…

Subversion svn 开源的版本控制系统入门介绍 VCS

拓展阅读 Subversion 开源的版本控制系统入门介绍 VCS Git 开源的版本控制系统-01-入门使用介绍 Git 开源的版本控制系统-02-base usage 基本用法 Git 开源的版本控制系统-03-时间数据回溯 Git 开源的版本控制系统-04-branch manage 分支管理 Git 开源的版本控制系统-05-…

UE5数字孪生系列笔记(一)

智慧城市数字孪生系统 虚幻引擎连接数据库 将自己的mysql版本的libmysql.dll替换掉插件里面的libmysql.dll 然后将这个插件目录复制到虚幻项目目录下 然后添加这个插件即可 新建一个UMG&#xff0c;添加一个按钮试试&#xff0c;数据库是否连接 将UI添加到视口 打印是否连接…

力扣爆刷第87天之hot100五连刷21-25

力扣爆刷第87天之hot100五连刷21-25 文章目录 力扣爆刷第87天之hot100五连刷21-25一、240. 搜索二维矩阵 II二、160. 相交链表三、206. 反转链表四、234. 回文链表五、141. 环形链表 一、240. 搜索二维矩阵 II 题目链接&#xff1a;https://leetcode.cn/problems/search-a-2d-…

前端每日一练 :相邻元素、嵌套元素Margin 塌陷、合并问题如何额解决?

相邻元素外边距塌陷合并 表现示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</t…

Python与FPGA——sobel边缘检测

文章目录 前言一、sobel边缘检测二、Python sobel边缘检测三、FPGA sobel边缘检测总结 前言 边缘存在于目标、背景区域之间&#xff0c;它是图像分割所依赖的较重要的依据&#xff0c;也是图像匹配的重要特征。边缘检测在图像处理和计算机视觉中&#xff0c;尤其在图像的特征提…

LVS----DR模式

一、LVS-DR工作原理 1、LVS-DR数据包流向分析 客户端发送请求到Director Server (负载均衡器)&#xff0c;请求的数据报文&#xff08;源IP是CIP&#xff0c;目标IP是VIP&#xff09;到达内核空间。Director Server 和Real Server 在同一个网络中&#xff0c;数据通过二层数据…

turtle海龟画图

10. 画笔设置 1. 画笔设置 海龟库绘制时的线条是可以设置的&#xff0c;例如画笔的颜色&#xff0c;方法名如下&#xff1a; 方法名方法说明.pencolor(‘red’)设置画笔颜色&#xff0c;例如红色 import turtle #导入海龟图库 turtle.shape(turtle) #召唤海龟 turtle.pencolo…

【vue3之组合式API及其新特性】

组合式API及其新特性 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1.侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、…

Java开发从入门到精通(一):Java的基础语法进阶

Java大数据开发和安全开发 &#xff08;一&#xff09;Java注释符1.1 单行注释 //1.2 多行注释 /* */1.3 文档注释 /** */1.4 各种注释区别1.5 注释的特点1.5 注释的快捷键 &#xff08;二&#xff09;Java的字面量&#xff08;三&#xff09;Java的变量3.1 认识变量3.2 为什么…

(亲测可用)Adobe Photoshop 2024下载与安装

背景介绍&#xff1a;Adobe Photoshop 2024 是全球最受欢迎的图像编辑软件之一&#xff0c;2024年的版本带来了一系列令人印象深刻的功能&#xff1a; AI增强的自动选择和蒙版工具&#xff1a;现在&#xff0c;用户可以更轻松地选择和处理复杂的图像元素。更多的3D渲染功能&…

如何使用宝塔面板搭建Discuz并结合cpolar实现远程访问本地论坛

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

第3部分 原理篇3可验证凭证(VC)(2)

3.3.3. 可验证凭证生态 3.3.3.1. 生态中的角色和概念 本聪老师&#xff1a;问大家个问题&#xff0c;我们生活中常见的实物凭证包括哪些信息&#xff1f; 小天&#xff1a;以身份证为例&#xff0c;包括姓名、性别、出生年月、住址等个人信息&#xff0c;还有发证部门&#…