【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/231022.shtml

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

相关文章

Surface pro官方镜像恢复详细图文步骤

某些小白不会弄直接找淘宝远程刷官方系统&#xff0c;还被忽悠什么原版序列号会抹掉这样的笑话&#xff0c;真的很无语 一、准备恢复优盘 1、微软官方下载中心&#xff0c;按序列号下载&#xff0c;对应镜像&#xff0c;推荐最新版&#xff0c;但一般都要有注册微软账号才能下…

微信小程序背景图片设置

问题 :微信小程序通过css:background-image引入背景图片失败 [渲染层网络层错误] pages/wode/wode.wxss 中的本地资源图片无法通过 WXSS 获取&#xff0c;可以使用网络图片&#xff0c;或者 base64&#xff0c;或者使用<image/>标签 解决方法微信小程序在使用backgroun…

QT Widget - 随便画个圆

简介 实现在界面中画一个圆, 其实目的是想画一个LED效果的圆。代码 #include <QApplication> #include <QWidget> #include <QPainter> #include <QColor> #include <QPen>class LEDWidget : public QWidget { public:LEDWidget(QWidget *pare…

机器学习 | SVM支持向量机

欲穷千里目&#xff0c;更上一层楼。 一个空间的混乱在更高维度的空间往往意味着秩序。 Machine-Learning: 《机器学习必修课&#xff1a;经典算法与Python实战》配套代码 - Gitee.com 1、核心思想及原理 针对线性模型中分类两类点的直线如何确定。这是一个ill-posed problem。…

从零开始实现分布式服务系统

文章目录 开发前言分布式模型系统图解注册中心模块基础服务模块被依赖的服务模块&#xff08;日志服务&#xff09;服务模块&#xff08;访问服务&#xff09;运行效果开发总结 开发前言 分布式系统具有高可靠性、高性能、可扩展性、灵活性、数据共享、可靠性和地理分布等优点…

【计算机网络】TCP协议——3. 可靠性策略效率策略

前言 TCP是一种可靠的协议&#xff0c;提供了多种策略来确保数据的可靠性传输。 可靠并不是保证每次发送的数据&#xff0c;对方都一定收到&#xff1b;而是尽最大可能让数据送达目的主机&#xff0c;即使丢包也可以知道丢包。 目录 一. 确认应答和捎带应答机制 二. 超时重…

小信砍柴的题解

目录 原题描述&#xff1a; 时间&#xff1a;1s 空间&#xff1a;256M 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 样例1输入&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注意事项&#xff1a; 总代码&#xff1a; 原题描述&#…

计网01 计算机网络基础

一、计算机网络基本概念 1、什么是计算机网络 网络&#xff1a;由两台或多台计算机通过网络设备串联&#xff08;网络设备通过传输介质串联&#xff09;而形成的网络网络设备&#xff1a;计算机、路由交换、防火墙、上网行为管理等传输介质&#xff1a;双绞线&#xff08;网线…

微服务——服务异步通讯(MQ高级)

MQ的一些常见问题 消息可靠性 生产者消息确认 返回ack&#xff0c;怎么感觉这么像某个tcp的3次握手。 使用资料提供的案例工程. 在图形化界面创建一个simple.queue的队列&#xff0c;虚拟机要和配置文件里面的一样。 SpringAMQP实现生产者确认 AMQP里面支持多种生产者确认的类…

【华为】文档中命令行约定格式规范(命令行格式规范、命令行行为规范、命令行参数格式、命令行规范)

文章目录 命令行约定格式**粗体&#xff1a;命令行关键字***斜体&#xff1a;命令行参数*[ ]&#xff1a;可选配置{ x | y | ... } 和 [ x | y | ... ]&#xff1a;选项{ x | y | ... }* 和 [ x | y | ... ]*&#xff1a;多选项&<1-n>&#xff1a;重复参数#&#xff…

kill编译异常处理

当kill编译时出现如下警告 Build target Target 1 linking... *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_LCD_SHOWCHAR?LCD1602 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_LCD_SHOWSTRING?LCD…

SpringSecurity 手机号登录

一、工作流程 1.向手机发送验证码&#xff0c;第三方短信发送平台&#xff0c;如阿里云短信。 2.手机获取验证码后&#xff0c;在表单中输入验证码。 3.使用自定义过滤器​SmsCodeValidateFilter​。 4.短信校验通过后&#xff0c;使用自定义手机认证过滤器​SmsCodeAuthentic…

UE4/UE5 日志插件(基于spdlog)

1 解决问题 对于高频日志序列化到本地的需求&#xff0c;spdlog肯定完美满足。 源码地址&#xff1a;https://github.com/gabime/spdlog 博主下载的版本为 spdlog-1.12.0&#xff0c;各位大佬可以根绝自己爱好选择。 2 过程介绍 大概目录&#xff1a; SpdlogLibC目录下是对…

Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标

一、前言 通过在通道画面上拾取鼠标按下的坐标&#xff0c;然后鼠标移动&#xff0c;直到松开&#xff0c;根据松开的坐标和按下的坐标&#xff0c;绘制一个矩形区域&#xff0c;作为热点或者需要电子放大的区域&#xff0c;拿到这个坐标区域&#xff0c;用途非常多&#xff0…

C语言之文件操作(下)

C语言之文件操作&#xff08;下&#xff09; 文章目录 C语言之文件操作&#xff08;下&#xff09;1. 文件的顺序读写1.1 文件的顺序读写函数1.1.1 字符输入/输出函数&#xff08;fgetc/fputc&#xff09;1.1.2 ⽂本⾏输⼊/输出函数&#xff08;fgets/fputs&#xff09;1.1.3 格…

工业应用新典范,飞凌嵌入式FET-D9360-C核心板发布!

来源&#xff1a;飞凌嵌入式官网 当前新一轮科技革命和产业变革突飞猛进&#xff0c;工业领域对高性能、高可靠性、高稳定性的计算需求也在日益增长。为了更好地满足这一需求&#xff0c;飞凌嵌入式与芯驰科技&#xff08;SemiDrive&#xff09;强强联合&#xff0c;基于芯驰D9…

SI24R03国产自主可控RISC-V架构MCU低功耗2.4GHz收发芯片SoC

目录 RISC-V架构的优势SI24R03/04特性射频收发器模块特征MCU 模块特征 其他特征 RISC-V架构的优势 相对于目前主流的英特尔X86架构及ARM等架构来说&#xff0c;RISC-V架构具有指令精简、模块化、可扩展、开源、免费等优点。RISC-V的基础指令集只有40多条&#xff0c;加上其他基…

Kafka--从Zookeeper数据理解Kafka集群工作机制

从Zookeeper数据理解Kafka集群工作机制 这一部分主要是理解Kafka的服务端重要原理。但是Kafka为了保证高吞吐&#xff0c;高性能&#xff0c;高可扩展的三高架构&#xff0c;很多具体设计都是相当复杂的。如果直接跳进去学习研究&#xff0c;很快就会晕头转向。所以&#xff0c…

Echarts相关配置

title&#xff1a;标题组件 tooltip:提示框组件 legend:图例组件 toolbox:工具栏 grid&#xff1a;直角坐标系内绘图网格 xAxis:直角坐标系grid中的x轴 yAxis&#xff1a;直角坐标系grid中的y轴 series:系列列表。每个系列通过type决定自己的图表类型 color&#xff1a;调色…

如何用 Cargo 管理 Rust 工程系列 戊

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/-OiWtUCUc3FmKIGMBEYfHQ 单元和集成测试 Rust 为单元测试提供了非常好的原生支持。 创建库工程时&#xff0c;cargo 生成的源码文件 lib.rs 自带…