专题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,一经查实,立即删除!

相关文章

【c++】类中成员函数和成员变量的存储

成员函数和成员变量是分开存储的 1. 非静态成员变量&#xff0c;属于类的一部分&#xff0c;sizeof(类名)的时候会包括进去 2. 静态成员变量&#xff0c;不属于类的一部分&#xff0c;不会影响类的大小 3. 成员函数&#xff0c;都不属于类的一部分 4. 空类大小为1B

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

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

一. Ubuntu入门

目录 一. Ubuntu系统安装 1. 安装虚拟机软件VMware 2. 安装Ubuntu操作系统 二. Ubuntu系统入门 1. Shell操作 1.1 Shell 简介 1.2 Shell基本操作 1.3 常用Shell命令 (1) 目录信息查看命令ls (2) 目录切换命令cd (3) 当前路径显示命令pwd (4) 系统信息查看命令uname…

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 优化模型文…

Pytest教程:Pytest的跳过与标记功能用法

一、pytest跳过功能 1. 使用 pytest.skip 装饰器跳过测试用例 Pytest中的 pytest.skip 装饰器允许你跳过指定的测试用例。你可以将该装饰器应用于测试函数或测试类上。 import pytestpytest.mark.skip(reason"Skipping this test case") def test_skip():assert 1…

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

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

虚拟化相关面试题集锦(1)—— 如何在QEMU/KVM中跑通AI相关训练

接前一篇文章&#xff1a;虚拟化相关面试题集锦&#xff08;0&#xff09;—— 引言 问题1 问&#xff1a;如何在QEMU/KVM虚拟机上跑通AI相关模型的训练和测试&#xff0c;并对虚拟机的GPU资源的分配进行配置和优化&#xff1f; 备注&#xff1a;此问题是笔者年上周参加中科时…

图论练习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;测试是否会…

react hooks useReducer使用

在React中&#xff0c;useReducer是一个用于管理组件状态的Hook&#xff0c;它特别适用于处理复杂的状态逻辑和多个相关状态。这个Hook接收一个reducer函数&#xff08;与Redux中的reducer概念类似&#xff09;和一个初始状态作为参数&#xff0c;并返回一个新的state值以及一个…

Unity中关于继承ScriptableObject的类

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

JavaScript极速入门(1)

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

.jsonl 格式文件的解释

根据 CHATGPT .jsonl 文件格式是一种文本文件格式&#xff0c;通常用于存储每行一个JSON对象的数据。.jsonl 文件的每一行都是一个独立的JSON对象&#xff0c;这些对象之间没有任何分隔符。 以下是一个示例.jsonl文件的内容&#xff1a; {"name": "John"…

【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-…

SpringBoot使用Jackson 序列化小妙招

前言 SpringBoot默认使用Jackson进行json数据的序列化&#xff0c;在这个过程中总会有些奇奇怪怪的需求&#xff0c;对于这些小需求要么增加一堆配置类&#xff0c;要么重写方法&#xff0c;其实都有点杀鸡用牛刀了&#xff0c;那么我来列举下日常开发中这些小需求如何通过配置…

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;尤其在图像的特征提…