【LeetCode刷题笔记(5)】【Python】【盛最多水的容器】【双指针】【中等】

news2024/11/24 15:21:58

文章目录

  • 盛最多水的容器
    • 算法题描述
    • 示例
      • 示例 1
      • 示例 2
    • 提示
    • 题意拆解
  • 解决方案:【双指针】
    • 运行结果
    • 复杂度分析
  • 结束语

盛最多水的容器

盛最多水的容器

算法题描述

给定一个长度为 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

题意拆解

【盛最多水的容器】本质上是区间问题,因为我们需要找到两个垂线,它们与x轴构成的区间能够容纳最多的水。这涉及到【比较不同区间的容量】,并【找出最大值】。

问题1:给定区间,即给定左边界left和右边界right,如何确定这个区间能够容纳多少水?

依据木桶原理!!!木桶原理告诉我们,一个木桶盛水的多少,由最短的木板决定。因此,不难确定,当前这个给定区间所能容纳水的面积公式为:
C u r A r e a = ( r i g h t − l e f t ) ∗ min ⁡ ( h e i g h t [ l e f t ] , h e i g h t [ r i g h t ] ) Cur Area = (right - left) * \min(height[left], height[right]) CurArea=(rightleft)min(height[left],height[right])
其中, height[left]表示左边界垂线的高度,height[right]表示右边界垂线的高度。(right - left)表示的是区域的宽度。

问题二:现在已知给定区间的容纳面积,如何才能获取其他区间的容纳面积?

如果我们需要获取其他区间的容纳面积,不可避免地需要移动左指针/右指针改变左边界/右边界 ===> 自然引出双指针法

问题三:既然需要移动左/右指针,怎么移动才比较高效?总不能暴力遍历所有区域,每个区域都进行面积的计算和比较吧?

明确本题的核心任务:找到能够容纳最多的水的区域,并返回其容纳面积 ==> 我们可以围绕这个目标设计算法,提前规避一些不必要的比较操作。

根据容纳面积的计算公式,如果我们希望下一个遍历的区域能够比当前的区域的容纳面积大,无非在两个方向上使劲:

  1. 下一个区域的宽度(right - left)比当前更宽。这个是不现实的,因为我们的左右边界起始就是数组height的两端。当移动左/右边界时,只可能使宽度变窄,不可能变得更宽。

    问题四:既然左右指针一开始放在数组两端只会使宽度变得更窄,为什么还要这样设计?不能一开始同时初始化为0吗?

    因为会给这个问题增加不确定性,导致无法确定下一步应该移动左边界还是右边界才能使得面积朝着可能变大的方向前进。面积的计算公式是由高度宽度同时决定的,在遍历的过程中,如果两者的变化都是不确定的,那么最后可能会退化成暴力搜索。

    如果我们将左右边界一开始就初始化为数组的左右两端,就可以专注于设计算法去控制高度的变化,因为宽度一定会变窄,只有高度更高才可能出现面积变得更大的情况。

  2. 下一个区域的高度(right - left)比当前更高。根据【木桶原理】,一个木桶盛水的多少,由最短的木板决定。因此我们移动当前更高的边界是没有任何意义的(如示例1所示,左边界更高),因为即使左边界在下一步中变得更高,依然逃不过被右边界拖后腿的命运。同时,宽度一定会变窄 ==> 移动高的边界,面积不可能会增加。

    综上所述,我们只能移动低的边界,如果低的边界变得更高,且高的幅度大于宽变窄的幅度,那么我们便找到了拥有更大容纳面积的区域

解决方案:【双指针】

代码如下:

class Solution:  
    def maxArea(self, height: List[int]) -> int:  
        """  
        计算由给定高度列表构成的矩形容器的最大面积。  
  
        参数:  
        height: 一个整数列表,表示每条线的高度。  
  
        返回:  
        返回最大面积。  
        """  
        n = len(height)  # 获取高度列表的长度  
        left = 0  # 左指针  
        right = n - 1  # 右指针  
        max_area = 0  # 最大面积初始化为0  
  
        while left < right:  # 当左指针小于右指针时,继续循环  
            cur_area = (right - left) * min(height[left], height[right])  # 计算当前矩形的面积  
            if cur_area > max_area:  # 如果当前面积大于最大面积,则更新最大面积  
                max_area = cur_area  
  
            # 根据当前矩形的左边界和右边界的高度(即左右指针所形成的线的高度)决定移动哪个指针  
            if height[left] < height[right]:  # 如果左指针所形成的线的高度较低  
                left += 1  # 移动左指针  
            else:  # 否则  
                right -= 1  # 移动右指针  
  
        return max_area  # 返回最大面积

运行结果

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(N),其中 N 是数组height元素的数量。

    • 双指针遍历height数组 ==> O(N)
  • 空间复杂度:O(1)

    • 只需要额外的常数级别的空间 ===> O(1)

结束语

  • 亲爱的读者,感谢您花时间阅读我们的博客。我们非常重视您的反馈和意见,因此在这里鼓励您对我们的博客进行评论。
  • 您的建议和看法对我们来说非常重要,这有助于我们更好地了解您的需求,并提供更高质量的内容和服务。
  • 无论您是喜欢我们的博客还是对其有任何疑问或建议,我们都非常期待您的留言。让我们一起互动,共同进步!谢谢您的支持和参与!
  • 我会坚持不懈地创作,并持续优化博文质量,为您提供更好的阅读体验。
  • 谢谢您的阅读!

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

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

相关文章

虚拟展会展览如何搭建,虚拟展会展览有哪些优势

引言&#xff1a; 随着科技的不断进步&#xff0c;虚拟展会展览正逐渐成为企业推广和交流的新方式。那么虚拟展会展览应该如何搭建&#xff0c;虚拟展会展览又能带来哪些好处呢&#xff1f; 一.什么是虚拟展会展览 虚拟展会展览是一种通过网络平台进行的展览&#xff0c;与传…

制作RK3568 ubuntu20.04桌面版镜像

平台 主控: RK3568 编译主机: Ubuntu 20.04 AMD64 目标版本: Ubuntu 20.04 概述 RK3568是极具性价比的高能国产“芯“ , 是Rockchip面向与AIOT和工业市场打造的一款高性能、低功耗、功能丰富的国产化应用处理器。采用四核64位Cortex-A55架构&#xff0c;主频高达2.0GHz&#x…

数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)

目录 队列的概念 队列的数据结构 队列的实现 入队 出队 获取队头元素 获取队列长度 循环队列的概念 循环队列的数据结构 循环队列的实现 判断队列是否为空 判断队列是否已满 入队 出队 得到队头元素 得到队尾元素 队列的概念 队列&#xff08;Queue&#xff0…

如何在使用Docker快速部署StackEdit并实现公网访问本地编辑器远程办公

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

简单好用的图像编辑:Pixelmator Pro直装中文 for Mac

在 Pixelmator Pro 中&#xff0c;您可以找到从亮度、对比度和曝光等基本颜色调整到多通道曲线和基于轮的颜色平衡等高级工具的所有内容。 自动增强照片。 许多最重要的调整可以自动应用&#xff0c;使用经过 2000 万张照片训练的机器学习算法。 完善每一个细节。 神奇地移除…

回收站数据恢复,分享3个可行方法!

“我真的太粗心啦&#xff01;本来想删除一些电脑里不重要的文件&#xff0c;但是不小心把一些很重要的文件一起删除了&#xff0c;这可怎么办呢&#xff1f;我应该通过什么方法找回这些文件呢&#xff1f;” 在使用电脑的过程中&#xff0c;误删文件是很多用户都无法避免的一件…

使用vs code开发microPython,消除库文件报错

使用vs code 写microPython代码的时候&#xff0c;总是遇到库文件报错&#xff0c;也就是类似machine之类的库下面会有波浪线&#xff0c;看起来很是别扭。 前几天在翻看树莓派pico的文档&#xff0c;发现里面提供了很好的方法。 安装vs code环境 $ sudo apt update $ sudo a…

如何在Windows系统上部署VisualSVN并实现远程访问管理界面【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

eclipse安装astview插件

astview插件可以展示java源码经过词法、语法分析后生成的抽象语法树&#xff08;AST&#xff09;&#xff1a; 在eclipse中安装该插件&#xff0c;见官方&#xff1a;org.eclipse.jdt.astview - AST View | The Eclipse Foundation 我的eclipse版本2020-06&#xff0c;开始使用…

触想智能工业一体机在金属3D打印机上的应用

1、行业发展背景 3D打印又称“增材制造”&#xff0c;是一种以数字模型为基础&#xff0c;通过逐层堆叠将打印材料熔结固化为三维实体物件的先进制造技术。 随着航空航天、科研、医疗、汽车等精工领域的颠覆性发展&#xff0c;制造业对于高强度、高精度、轻量型、柔性化金属零件…

联合电子车载充配电单元全球量产

2023年12月&#xff0c;联合电子新一代车载充配电单元批量交付。该产品将应用于全球市场&#xff0c;可覆盖中国、欧洲、北美、日本的交流与直流充电通讯体系。 该车载充配电单元由车载充电机&#xff08;On-board Charger&#xff09;和高压直流转换器&#xff08;HV DCDC Co…

Python数据科学视频讲解:Python数据检索

3.3 Python数据检索 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解3.3节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应…

Linux服务器性能优化小结

文章目录 生产环境监测常见专业名词扫盲服务器平均负载服务器平均负载的定义如何判断平均负载值以及好坏情况如果依据平均负载来判断服务器当前状况系统平均负载和CPU使用率的区别 CPU上下文切换基本概念3种上下文切换进程上下文切换线程上下文切换中断上下文切换 查看上下文切…

Kafka消息延迟和时序性详解(文末送书)

目录 一、概括1.1 介绍 Kafka 消息延迟和时序性1.1.1 什么是 Kafka 消息延迟&#xff1f;1.1.2 为什么消息延迟很重要&#xff1f;1.1.3 什么是 Kafka 消息时序性&#xff1f;1.1.4 消息延迟和时序性的关系 1.2 延迟的来源1.2.1 Kafka 内部延迟 二、衡量和监控消息延迟2.1 延迟…

内网BUG管理系统本地部署并结合内网穿透实现异地远程访问

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

2023.12.17Linux基础命令

ls -l详细信息 -a所有 springcloud微服务 ctrlalt鼠标左键&#xff0c;从虚拟机中回到本机 执行这两条语句 拿到远程主机的ip地址之后就要试图连接 要实现连接&#xff0c;就要有远程连接的软件 ssh和http一样&#xff0c;也是一种协议 SSH 是 Secure Shell&am…

查看知乎数学公式Tex源码的方法

首先使用F12打开开发者工具&#xff0c;再使用元素选择器选中要查看的公式。 在源码对应位置附近可以看到一个类型为 math/tex 的 script&#xff0c;如果没找到可以展开目录查找。

H264码流打包分析

H264码流打包分析 SODB 数据比特串&#xff0d;&#xff0d;&#xff1e;最原始的编码数据 RBSP 原始字节序列载荷&#xff0d;&#xff0d;&#xff1e;在SODB的后面填加了结尾比特&#xff08;RBSP trailing bits 一个bit“1”&#xff09;若干比特“0”,以便字节对齐。…

电流源输出的是直流电还是交流电(高精度电流源)

电流源是一种能够提供电流输出的电子设备&#xff0c;它可以产生直流电流或交流电流&#xff0c;具体取决于其设计和应用的需要。 首先&#xff0c;我们来讨论电流源输出直流电的情况。直流电是指电流的方向始终保持不变的电流形式。在一些特定的应用中&#xff0c;需要稳定的、…

iClient3D 图元操作

1. S3MTilesLayer&#xff0c;S3M(Spatial 3D Model)图层类 S3MTilesLayer&#xff0c;S3M(Spatial 3D Model)图层类&#xff0c;通过该图层实现加载三维切片缓存&#xff0c;包括倾斜摄影模型、BIM模型、点云数据、精细模型、矢量数据、符号等。 那S3MTilesLayer中针对图元的…