LeetCode_11_中等_盛最多水的容器

文章目录

  • 1. 题目
  • 2. 思路及代码实现(Python)
    • 2.1 双指针


1. 题目

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

找出其中的两条线,使得它们与 x x 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 = = h e i g h t . l e n g t h n == height.length n==height.length
  • 2 < = n < = 1 0 5 2 <= n <= 10^5 2<=n<=105
  • 0 < = h e i g h t [ i ] < = 1 0 4 0 <= height[i] <= 10^4 0<=height[i]<=104

2. 思路及代码实现(Python)

2.1 双指针

这里有一个很直接的方式,就是遍历所有的容器边界组合,一个个对比找到装水最多的,但是这样的算法复杂度为 O ( n 2 ) O(n^2) O(n2),那是否有办法缩减掉一些组合呢?使得我们并不需要遍历所有的组合也能找到容量最大的容器。

这个方法就是双指针,在列表的左右两端生成指针,不断地把指针向中间靠拢,能够覆盖所有地容器边界情况,但是每一次移动指针,都会缩减一部分边界组合,这里就有一个问题,到底需要移动哪个指针?假设有两个指针在列表的 i , j i,j i,j 位置,其中, h e i g h t [ i ] < h e i g h t [ j ] height[i] < height[j] height[i]<height[j],不论我们移动哪一边的指针,容器的长都会减小,且容器的高取决于最矮的边界,因此,对于左指针(较矮)而言,不会有包含左指针的组合且容量还大于当前组合的情况了,因此左指针可以移动。

例如:[3,>2,6,8,3,2,4<],假设左指针在2,右指针在4,此时的容器容量为 5 × 2 = 10 5\times 2=10 5×2=10,显然,不论我们如何移动右指针,只要左指针还是2的位置,那右指针的值可能比4高,或者比4低甚至比2低,但新容器的长都会小于5,且高不会高于2(取边界的较小值),因此固定左指针2之后的容器容量不会再高于10,此时可以舍弃左指针的位置,向右移动。

依次类推,左右指针不断把较小值向中间推移,最终得到的较大容量即为总体最大的容量。此时,由于指针只移动了 n n n 次,因此算法时间复杂度为 O ( n ) O(n) O(n),而移动指针的过程只记录指针位置和当前最大值,空间复杂度为 O ( 1 ) O(1) O(1)

class Solution:
    def maxArea(self, height: List[int]) -> int:
        l, r = 0, len(height) - 1
        ans = 0
        while l < r:
            area = min(height[l], height[r]) * (r - l)
            ans = max(ans, area)
            if height[l] <= height[r]:
                l += 1
            else:
                r -= 1
        return ans

执行用时:169 ms
消耗内存:26.77 MB

参考来源:力扣官方题解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python入门(一)

anaconda安装 官网&#xff1a;https://www.anaconda.com下载 jupyter lab 简介&#xff1a; 包含了Jupyter Notebook所有功能。 JupyterLab作为一种基于web的集成开发环境&#xff0c;你可以使用它编写notebook&#xff0c;操作终端&#xff0c;编辑markdown文本&#xf…

openGauss学习笔记-205 openGauss 数据库运维-常见故障定位案例-业务运行时整数转换错

文章目录 openGauss学习笔记-205 openGauss 数据库运维-常见故障定位案例-业务运行时整数转换错205.1 业务运行时整数转换错205.1.1 问题现象205.1.2 原因分析205.1.3 处理办法 openGauss学习笔记-205 openGauss 数据库运维-常见故障定位案例-业务运行时整数转换错 205.1 业务…

CSS之边框样式

让我为大家介绍一下边框样式吧&#xff01;如果大家想更进一步了解边框的使用&#xff0c;可以阅读这一篇文章&#xff1a;CSS边框border 属性描述none没有边框,即忽略所有边框的宽度(默认值)solid边框为单实线dashed边框为虚线dotted边框为点线double边框为双实线 代码演示&…

Vulnhub靶机:FunBox 4

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox 4&#xff08;10.0.2.29&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/funbo…

Java 面向对象案例 03(黑马)

代码&#xff1a; public class phoneTest {public static void main(String[] args) {phone [] arr new phone[3];phone p1 new phone("华为",6999,"白色");phone p2 new phone("vivo",4999,"蓝色");phone p3 new phone("苹…

喷墨打印机市场分析:预计2029年将达到548亿美元

喷墨打印机是将彩色液体油墨经喷嘴变成细小微粒喷到印纸上,有的喷墨打印机有三个或四个打印喷头&#xff0c;以便打印黄、品红青黑四色;有的是共用一个喷头&#xff0c;分四色喷印。 喷墨打印机是在针式打印机之后发展起来的&#xff0c;采用非打击的工作方式。比较突出的优点有…

STM32标准库开发——串口发送/单字节接收

USART基本结构 串口发送信息 启动串口一的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);初始化对应串口一的时钟&#xff0c;引脚&#xff0c;将TX引脚设置为复用推挽输出。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_In…

第7章 7.6.5 常量指针 Page406~407

const可以限制指针指向的数据&#xff0c;也可以限制指针的指向 const限制指针指向的数据&#xff0c;不可以修改指向的数据&#xff0c;可以改变指向 推荐写法 常见写法&#xff1a;

discuz论坛附件上传限制大小2MB

我遇到了这个问题&#xff0c;去修改了配置PHP.ini文件没有解决. 我把他变成2000M依旧没有用&#xff0c;然后我选择了用户组&#xff0c;附件部分。如图所示&#xff1a; 然后这个时候我还是没有好&#xff0c;我同事的却不限制大小了&#xff0c;我去清理缓存&#xff…

k8s 容器 java 应用内存限制不生效

一 k8s java 应用内存限制不生效 回顾&#xff1a;Linux杂谈之java命令 namespace负责资源隔离 cgroups负责资源限制 容器JVM最佳实践 Metaspace 是 非 Heap 内存 管理空间,那么 Heap 就是操作空间 JVM内存模型简介 隔离&#xff1a; 两个进程完全隔离感知&#xff1…

进程线程知识

一 初识linux线程 1 线程由来 我们之前说创建一个进程&#xff0c;要创建进程控制块pcb&#xff0c;进程地址空间&#xff0c;页表&#xff0c;而且我之前的博客中都有意无意的说明这个pcb是描述进程的&#xff0c;是os用来管理进程的&#xff0c;而有了线程后&#xff0c;就要…

linux中用户及用户组信息

1&#xff0c;linux通过用户名和口令来验证用户的身份。 2&#xff0c;几个用户可以组成一个用户组。 3&#xff0c;useradd工具添加用户&#xff0c;groupadd命令添加用户组。 4&#xff0c;history 命令查看用户在Shell中执行命令的历史记录。 5&#xff0c;userdel命令删…

机械硬件知识学习

目录 1.电机减速机、扭矩2.伺服电机、步进电机、直线电机3.电机马达的曲线运动是如何转化为轴的直线运动 大佬科普运动控制系统链接&#xff1a;https://www.cnblogs.com/cariohu/p/15508175.html 自己对机械知识的了解是盲区&#xff0c;学习下接触到的一些硬件知识&#xff0…

Ubuntu Desktop Server - xport: command not found

Ubuntu Desktop Server - xport: command not found 1. xport: command not found2. export 错误写成了 xportReferences 1. xport: command not found 2. export 错误写成了 xport strongforeverstrong:~$ gedit ~/.bashrcReferences [1] Yongqiang Cheng, https://yongqian…

部署 Seafile 开源企业云盘

一、Seafile 介绍 Seafile 简介 :::info 官网&#xff1a;https://www.seafile.com/ GitHub&#xff1a;https://github.com/haiwen/seafile ::: Seafile 是一款开源的企业云盘&#xff0c;注重可靠性和性能。 支持 Windows&#xff0c;Mac&#xff0c;Linux&#xff0c;iOS&…

算法复杂度分析看这一篇就够了

2023年也慢慢的步入了年末&#xff0c;光阴易逝&#xff0c;前段时间在学习算法的时候谈到了复杂度&#xff0c;所以今天就来总结一下 算法的复杂度是衡量算法执行效率的度量标准。它描述了随着输入规模的增加&#xff0c;算法所需执行的基本操作的数量或运行时间的增长程度。一…

JSP的学习

1.JSP概念: Java服务端页面;一种动态的网页技术,既可以定义HTML,JS,CSS等静态内容,也可以定义Java代码的动态内容;JSPHTMLJava;JSP的作用:简化开发,避免了在Servlet中直接输出HTML标签; 2.JSP快速入门 3.JSP原理 概念&#xff1a;Java Server Pages&#xff0c;Java服务端页…

C# CefSharp 输入内容,点击按钮,并且滑动。

前言 帮别人敲了个Demo,抱试一试心态&#xff0c;居然成功了&#xff0c;可以用。给小伙伴们看看效果。 遇到问题 1&#xff0c;input输入value失败&#xff0c;里面要套了个事件&#xff0c;再变换输入value。后来用浏览器开发工具&#xff0c;研究js代码&#xff0c;太难了&a…

UG制图-全剖和阶梯剖

当机件的内部形状较复杂时&#xff0c;视图上将出现许多虚线&#xff0c;不便于看图和标注尺寸 解决方法就是使用剖视图 剖视图的形成&#xff1a;假想用一个剖切面将机件剖开&#xff0c;移去剖切面和观察者之间的部分&#xff0c;将其余部分向投影面投射&#xff0c;并在剖切…

【数据结构】 链栈的基本操作 (C语言版)

目录 一、链栈 1、链栈的定义&#xff1a; 2、链栈的优缺点&#xff1a; 二、链栈的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、链栈的初始化 4、链栈的进栈 5、链栈的出栈 6、获取栈顶元素 7、栈的遍历输出 8、链栈的判空 9、求链…