【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.mzph.cn/news/221671.shtml

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

相关文章

【排序算法】希尔排序

一&#xff1a;基本介绍 插入排序介绍 1.1 插入排序存在问题 我们看简单的插入排序可能存在的问题 数组 arr {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是&#xff1a; {2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6} 结论:…

AI猫图片展示

AI猫展示 文章目录 AI猫展示

【sgAutocomplete】自定义组件:基于elementUI的el-autocomplete组件开发的自动补全下拉框组件(带输入建议的自动补全输入框)

特性&#xff1a; 1、支持本地保存选中过的记录 2、支持动态接口获取匹配下拉框内容 3、可以指定对应的显示label和字段组件key 4、自动生成速记符字段&#xff08;包含声母和全拼两种类型&#xff09;&#xff0c;增强搜索匹配效率 sgAutocomplete源码 <template><!…

计算机网络:物理层(奈氏准则和香农定理,含例题)

带你速通计算机网络期末 文章目录 一、码元和带宽 1、什么是码元 2、数字通信系统数据传输速率的两种表示方法 2.1、码元传输速率 2.2、信息传输速率 3、例题 3.1、例题1 3.2、例题2 4、带宽 二、奈氏准则&#xff08;奈奎斯特定理&#xff09; 1、奈氏准则简介 2、…

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

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

Flink Window中典型的增量聚合函数(ReduceFunction / AggregateFunction)

一、什么是增量聚合函数 在Flink Window中定义了窗口分配器&#xff0c;我们只是知道了数据属于哪个窗口&#xff0c;可以将数据收集起来了&#xff1b;至于收集起来到底要做什么&#xff0c;其实还完全没有头绪&#xff0c;这也就是窗口函数所需要做的事情。所以在窗口分配器…

计算机组成原理-ATT格式vsIntel格式

文章目录 AT&T格式 vs lntel格式 x86汇编语言是lntel格式&#xff0c;还有一种汇编语言格式是AT&T AT&T格式 vs lntel格式 lntel格式中取主存地址内容未指明长度默认为32位&#xff0c;对应下图中第四行右边的指令 百分号 美元符号 小括号 可用于计算机结构体数组…

竞赛保研 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

Amazon Q:对话智能赋能企业发展

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 。 在最近举办的亚马逊云科技大会上&#xff0c;引人瞩目的消息是A…

斑马zebra目标检测数据集VOC+YOLO格式2300张

斑马是由四百万年前的原马进化出来的&#xff0c;最早出现的斑马可能是细纹斑马。有关史前马科动物的化石现存于美国爱达荷州克文的克文化石床国家博物馆。斑马的史前马为“克文马”&#xff08;美洲斑马或者克文斑马&#xff09;&#xff0c;学名为“Equussimplicidens”&…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展&#xff0c;众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说&#xff0c;选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大&#xff0c;云服务…

Nacos-NacosRule 负载均衡—设置集群使本地服务优先访问

userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 NacosRule 权重计算方法 目录 一、介绍 二、示例&#xff08;案例截图&#xff09; 三、总结 一、介绍 NacosRule是AlibabaNacos自己实现的一个负载均衡策略&…

《教育信息化论坛》期刊杂志论文发表投稿

《教育信息化论坛》由中原大地传媒股份有限公司主管&#xff0c;河南电子音像出版社、文心出版社主办&#xff0c;我刊立足于教育信息化、教育现代化科研&#xff0c;重点介绍国内外信息化、现代化教学手段、教学方式、教学传播研究的新成果和新观点&#xff0c;推广成功的国内…

【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

目录 1 设置请求映射路径1.1 环境准备 1.2 问题分析1.3 设置映射路径 2 请求参数2.1 环境准备2.2 参数传递2.2.1 GET发送单个参数2.2.2 GET发送多个参数2.2.3 GET请求中文乱码2.2.4 POST发送参数2.2.5 POST请求中文乱码 欢迎大家回到《Java教程之Spring30天快速入门》&#xff…

认识缓存,一文读懂Cookie,Session缓存机制。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

一、CM4树莓派系统烧录

操作系统&#xff08;Raspberry Pi OS&#xff09;应用程序 Raspberry Pi OS系统&#xff08;树莓派推荐系统&#xff09;&#xff1a;较小的内存占用、较高的易用性以及对浮点单元的支持 浮点单元&#xff1a;浮点运算单元&#xff08;FPU&#xff09;是处理器中专门进行浮点…

windows redis 允许远程访问配置

安装好windows版本的redis&#xff0c;会以服务方式启动&#xff0c;但是不能远程访问&#xff0c;这个时候需要修改配置。redis安装路径下会有2个配置文件&#xff0c;究竟需要怎么修改才能生效呢&#xff1f;看下图 这里的redis服务指定了是redis.windows-service.conf文件&…

Docker | 发布镜像到镜像仓库

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容:Docker | 发布镜像到镜像仓库 📚个人知识库: [Leo知识库]https://gaoziman.gitee.io/bl…

骨灰级程序员那些年曾经告诉我们的高效学习的态度

一、背景 以前阅读陈皓老师的左耳听风专栏中关于如何高效学习的总结让我收货颇丰&#xff0c;今天总结了一下&#xff0c;分享给大家 老师说&#xff1a; 学习是一件“逆人性”的事&#xff0c;就像锻炼身体一样&#xff0c;需要人持续付出&#xff0c;会让人感到痛苦&#…

c语言堆排序(详解)

堆排序 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;它的基本概念包括&#xff1a; 建立堆&#xff1a;将待排序的列表构建成一个二叉堆&#xff0c;即满足堆的性质的完全二叉树&#xff0c;可以是最大堆或最小堆。最大堆要求父节点的值大于等于其子节点的值&#x…