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

文章目录

  • 盛最多水的容器
    • 算法题描述
    • 示例
      • 示例 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.mfbz.cn/a/250138.html

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

相关文章

《深入理解 Android ART 虚拟机》笔记

Dex文件格式、指令码 一个Class文件对应一个Java源码文件&#xff0c;而一个Dex文件可对应多个Java源码文件。开发者开发一个Java模块&#xff08;不管是Jar包还是Apk&#xff09;时&#xff1a; 在PC平台上&#xff0c;该模块包含的每一个Java源码文件都会对应生成一个同文件…

点赋网络科技:为什么喝咖啡的人更易获得成功?

喝咖啡的人更易获得成功&#xff0c;这一说法并非空穴来风。事实上&#xff0c;许多成功的人士会坦诚地告诉你&#xff0c;他们每天都会饮用咖啡以激发思维和提高工作效率。下面&#xff0c;湖北点赋网络科技将从咖啡的作用、研究数据和成功人士的经验&#xff0c;三个方面来阐…

鸿蒙HarmonyOS开发用什么语言

1.网上流行一句有中国底蕴的话&#xff1a;鸿蒙系统方舟框架盘古大模型。都方舟框架了肯定主推的是ArkUI框架。其实还能使用C、Java和Js开发。 2.从API8开始&#xff0c;Java语言已经从鸿蒙开发剔除了&#xff0c;而官方推荐的是ArkTs.下图是ArkTS与TS、JS的关系。 ArkTs 是TS的…

物联网AI 物联网平台学习之概述

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 万物简单IOT是一个集物联网教育、企业SaaS私有化部署的物联网服务平台&#xff0c;它集成了设备管理、数据安全通信、消息订阅、规则引擎等一系列物联网核心能力&#xff0c;支持设备数据上云以及海量设备数…

RK3568/RV1126/RV1109/RV1106 ISP调试方案

最近一直在做瑞芯微rv1126的开发&#xff0c;由于项目性质&#xff0c;与camera打的交道比较多&#xff0c;包括图像的采集&#xff0c;ISP处理&#xff0c;图像处理&#xff0c;H.264/H.265编解码等各个方面吧。学到了不少&#xff0c;在学习的过程中&#xff0c;也得到了不少…

Linux的权限(二)

目录 前言 文件类型和访问权限&#xff08;事物属性&#xff09; 补充知识 文件类型 文件操作权限 修改文件权限 chmod指令 文件权限值的表示方法 字符表示方法 8进制数值表示方法 权限有无带来的影响 修改文件角色 chown与chgrp指令 目录的rwx权限 补充知识 …

Linux的重定向

Linux中的重定向是将程序的输入流或输出流从默认的位置改变到指定的位置。可以使用特殊的符号来实现重定向操作。&#xff08;文中command代表命令&#xff09; &#xff08;1&#xff09;重定向命令列表 命令 说明 command > file …

DevEco Studio中配置代码片段

进入设置&#xff08;快捷键CtrlAltS&#xff09; 选择Editor > Live Templates 添加片段 其中 $END$ 代表光标首次出现位置 一定要选择适用语言&#xff01;&#xff01;&#xff01; 最后Apply > OK 即可&#xff0c;输入快捷命令回车即可快速生成代码片段。

【Anaconda】Ubuntu anaconda使用(新建环境、最小化安装Tensorflow, CUDA对应关系)

Ubuntu anaconda使用&#xff08;新建环境、最小化安装Tensorflow&#xff09; 文章目录 Ubuntu anaconda使用&#xff08;新建环境、最小化安装Tensorflow&#xff09;使用conda打包虚拟环境查看已创建的环境删除虚拟环境命令下运行.ipynb文件 清华源地址&#xff1a; https:…

解决ES伪慢查询

一、问题现象 服务现象 服务接口的TP99性能降低 ES现象 YGC&#xff1a;耗时极其不正常, 峰值200次&#xff0c;耗时7sFULL GC&#xff1a;不正常,次数为1但是频繁&#xff0c;STW 5s慢查询&#xff1a;存在慢查询5 二 解决过程 1、去除干扰因素 从现象上看应用是由于某种…

小红书商品详情API:电商助力

一、引言 随着互联网的普及和电商行业的快速发展&#xff0c;消费者对于商品信息的获取方式也在不断变化。小红书作为一款以内容分享为主的社交电商平台&#xff0c;吸引了大量用户。为了满足用户对商品信息的快速获取需求&#xff0c;小红书提供了商品详情API接口。本文将探讨…

Linux 基本语句_15_Tcp并发服务器

原理&#xff1a; 利用父子进程。父进程接收客户端的连接请求&#xff0c;子进程处理客户端的数据处理操作&#xff0c;两者各施其职。最终实现能够多个客户端连接一个服务端的操作。 代码&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <sys/…

初级数据结构(五)——树和二叉树的概念

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;四&#xff09;——队列 | NULL 下一篇-> 1、树结构&#xff08;Tree&#xff09; 1.1、树结构的特点 自然界中的树由根部开始向上生长&#xff0c;随机长出分支&…

聊天系统UDP TCP

服务端 package work; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.ArrayList; import java.util.List; public class UDPServer { private static final int PORT 9876; private static List<ClientInfo> clients …

极简Excel公式拆分合并单元格并自动填充

例如这个表格&#xff1a; 我们希望拆分合并单元格&#xff0c;并填充到E列。结果如&#xff1a; 步骤 1&#xff09;在E2输入公式如下&#xff1a; LOOKUP(2,1/($B$2:B2<>""),$B$2:B2) 2&#xff09;下拉E2至E9将公式填充即可 注意&#xff1a;公式中的$…

分布式事务--初识Seata和TC部署

1.Seata介绍 Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务&#xff0c;为用户打造一站式的分布式解决方案。 官网地址&#xff1a;Seata | Seata&#xff0c;其中的文档、播客中提供了大量的使用说明…

Hudi 在 vivo 湖仓一体的落地实践

作者&#xff1a;vivo 互联网大数据团队 - Xu Yu 在增效降本的大背景下&#xff0c;vivo大数据基础团队引入Hudi组件为公司业务部门湖仓加速的场景进行赋能。主要应用在流批同源、实时链路优化及宽表拼接等业务场景。 一、Hudi 基础能力及相关概念介绍 1.1 流批同源能力 与H…

Windows系统下载安装并连接Redis

首先 我们访问地址 https://github.com/tporadowski/redis/releases 这里 我们根据自己的系统选择下载 我是 Windows msi安装包 下载下来之后 我们双击它运行 然后下一步 然后这里要同意它的条款 反正不同意不给用嘛 就这么简单 勾选之后 选择下一步 这里 我们要选一下他的安装…

Angular中使用Intersection Observer API实现无限滚动

背景&#xff1a; 实现原理为 在data下面加一个loading元素 如果此元素进入视窗 则调用api获取新的数据加到原来的数据里面&#xff0c;这时loading就会被新数据顶下去&#xff0c;如此循环。 <div id"dataContainer"></div> <div id"loadingCo…

大模型微调技巧:在 Embeeding 上加入噪音提高指令微调效果

大家好&#xff0c;在去年分享过一篇ACL2022的文章&#xff0c;通过微调前给预训练模型参数增加噪音提高预训练语言模型在下游任务的效果方法。NoisyTune方法在BERT、XLNET、RoBERTa和ELECTRA上均取得不错的效果。 那么通过加入噪音的方式&#xff0c;对现在大型语言模型是否有…