【力扣算法12】之 11. 盛最多水的容器 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

思路分析

在这里插入图片描述

  1. 首先,我们定义了一个Solution类,其中包含解决问题的方法maxArea。
  2. 方法maxArea接收一个整数数组height作为参数。
  3. 我们通过双指针来解决这个问题。左指针left初始化为数组的第一个元素下标0,右指针right初始化为数组最后一个元素的下标n-1。
  4. 初始化最大面积max_area为0。
  5. 进入循环,条件是左指针小于右指针。这是因为当左指针和右指针相遇时,无法再构成有效的容器。
  6. 在每一次循环中,我们计算当前的面积curr_area。面积的计算公式是两个指针所指高度较小值乘以两个指针之间的距离即(right - left)。
  7. 更新最大面积max_area,通过将当前面积curr_area与max_area比较,如果curr_area更大,则更新max_area。
  8. 接下来,根据以下三种情况移动指针:
    • 如果height[left]小于height[right],那么我们将左指针left向右移动一位,即left += 1,因为移动左指针不能增加当前的面积。
    • 如果height[left]大于height[right],那么我们将右指针right向左移动一位,即right -= 1,因为移动右指针不能增加当前的面积。
    • 如果height[left]等于height[right],那么我们既可以移动左指针也可以移动右指针。在这种情况下,无论移动哪个指针,都不会改变当前的面积。
  9. 循环结束后,返回最大面积max_area作为结果。

这种解决方法的核心思想是通过不断缩小有效宽度的范围,来寻找容器的最大面积。通过比较较小高度的指针向内移动,可以保留更有可能得到更大面积的高度。最终,我们得到了两条垂线所形成容器的最大面积。

代码分析

在这里插入图片描述

  1. 首先,我们定义了一个Solution类。
  2. 在类中,我们定义了一个方法maxArea,它接收一个整数数组height作为参数。
  3. 我们首先获取数组height的长度n,用于后续循环的条件判断。
  4. 初始化左指针left为0,右指针right为数组最后一个元素的下标n-1。
  5. 初始化最大面积max_area为0。
  6. 进入循环,条件是左指针left小于右指针right。
  7. 在循环中,我们计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离,使用min()函数取得较小值。
  8. 更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_area,用max()函数实现。
  9. 接下来,使用三个判断条件来决定指针的移动:
    • 如果height[left]小于height[right],说明左指针指向的高度较低,移动左指针left向右移动一位,即left += 1。
    • 如果height[left]大于height[right],说明右指针指向的高度较低,移动右指针right向左移动一位,即right -= 1。
    • 如果height[left]等于height[right],说明两边的高度相等,无论左指针left还是右指针right都可以移动,所以同时将左指针left向右移动一位,即left += 1,右指针right向左移动一位,即right -= 1。
  10. 循环结束后,返回最大面积max_area作为结果。

完整代码

在这里插入图片描述

class Solution(object):def maxArea(self, height):n = len(height)  # 获取数组height的长度nleft, right = 0, n - 1  # 初始化左指针left为0,右指针right为数组最后一个元素的下标n-1max_area = 0  # 初始化最大面积max_area为0while left < right:  # 进入循环,条件是左指针left小于右指针rightcurr_area = min(height[left], height[right]) * (right - left)  # 计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离max_area = max(max_area, curr_area)  # 更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_areaif height[left] < height[right]:  # 如果height[left]小于height[right]left += 1  # 移动左指针left向右移动一位elif height[left] > height[right]:  # 如果height[left]大于height[right]right -= 1  # 移动右指针right向左移动一位else:  # 如果height[left]等于height[right]left += 1  # 同时移动左指针left向右移动一位right -= 1  # 同时移动右指针right向左移动一位return max_area  # 返回最大面积max_area作为结果

详细分析

  1. 首先定义一个名为Solution的类。
class Solution(object):
  1. 然后,我们在Solution类中定义了一个名为maxArea的方法,该方法接收一个名为height的参数。
    def maxArea(self, height):
  1. 在方法体内部,我们获取数组height的长度,并将结果赋给变量n。
        n = len(height)
  1. 接下来,我们初始化左指针left为0,右指针right为数组最后一个元素的下标n-1。
        left, right = 0, n - 1
  1. 我们还定义了一个变量max_area,并将其初始化为0,用于保存最大面积的值。
        max_area = 0
  1. 在接下来的while循环中,我们判断左指针是否小于右指针,如果是,则执行循环体内的代码。
        while left < right:
  1. 在循环体内部,我们首先计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离。
            curr_area = min(height[left], height[right]) * (right - left)
  1. 接着,我们更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_area。
            max_area = max(max_area, curr_area)
  1. 然后,我们根据左指针和右指针指向的高度来移动指针。
  • 如果左指针指向的高度小于右指针指向的高度,则将左指针向右移动一位。
            if height[left] < height[right]:left += 1
  • 如果左指针指向的高度大于右指针指向的高度,则将右指针向左移动一位。
            elif height[left] > height[right]:right -= 1
  • 如果左指针指向的高度等于右指针指向的高度,则同时将左指针向右移动一位,并将右指针向左移动一位。
            else:left += 1right -= 1
  1. 循环结束后,我们返回最大面积max_area作为结果。
        return max_area

运行效果截图

调用示例

solution = Solution()
x = [1,8,6,2,5,4,8,3,7]
x1 = [1,1]
print(solution.maxArea(x))
print(solution.maxArea(x1))

运行结果

在这里插入图片描述

完结

在这里插入图片描述

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

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

相关文章

解决IDEA项目external libraries依赖包消失的问题

有时候电脑重启后&#xff0c;再打开IDEA上的项目时会出现external libraries目录下的依赖包都消失了的情况&#xff0c;只剩下了一个JDK的包 网上说可以通过刷新IDEA的缓存解决&#xff0c;但我试了没有效果&#xff0c;最后使用如下办法解决&#xff1a; 1.删除项目目录下的…

图论算法笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 第12章 最短路径算法12-1 有权图的最短路径问题最短路径问题-路径规划单源最短路径带权图的最短路径和无权图的最短路径带权图的最短路径算法-Dijkstra算法 12-2 Di…

搭载率突破40%!智能数字座舱比拼,车企还有降本空间吗?

进入2023年&#xff0c;汽车行业的「降本」风潮&#xff0c;驱动产业链上下游开始思考智能化、电动化的投入产出。除了显性的硬件成本&#xff08;继续堆料&#xff0c;强调性价比&#xff0c;还是减配&#xff09;&#xff0c;软件及背后的开发成本&#xff0c;对于车企来说&a…

GitLab 入选 Forrester Wave™️ 集成软件交付平台,并获评唯一「领导者」!

越来越多企业意识到多工具链集成带来的低效和高成本问题&#xff0c;同时承受着可见性低、反馈不畅通、网络风险大等痛点&#xff0c;应用平台方法来交付软件的呼声越来越大。 极狐(GitLab) 很早就意识到了平台方法的价值&#xff0c;也坚信极狐GitLab 这种单一应用程序的 DevS…

学习vue2笔记

学习vue2笔记 文章目录 学习vue2笔记脚手架文件结构关于不同版本的Vuevue.config.js配置文件ref属性props配置项mixin(混入)插件scoped样式总结TodoList案例webStorage组件的自定义事件全局事件总线&#xff08;GlobalEventBus&#xff09;消息订阅与发布&#xff08;pubsub&am…

el-date-picker 日期时间进行限制,精确到时分秒

需求&#xff1a;用户只能选择当时时间或当前时间之前的时间&#xff0c;且精确到时分秒 实现效果&#xff1a;用户只能选择当前时间的时间&#xff0c;如果选择是当天之前的时间&#xff0c;时分秒不做限制&#xff0c;如果选择的是当天时间&#xff0c;就要判断时分秒&#…

【数据挖掘】时间序列教程【十】

5.4 通用卡尔曼滤波 上一节中描述的状态空间模型作为观测方程的更一般的公式 和状态方程 这里是一个p1 向量是一个k1 向量, 是一个pk 矩阵, 是kk 矩阵。我们可以想到的和 给定初始状态 和 &#xff0c;预测方程为&#xff08;类似于上面&#xff09; 并且更新方程是&#x…

华为Harmony应用开发初探

HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供全场景(移动办公、运动健康、社交通信、媒体…

外包干了2个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Linux进程(二)---进程的优先级和环境变量

我想在这先完成上一章的一个未说完的话题.最后一个我们讲到了僵尸进程&#xff0c;是指子进程已经结束&#xff0c;但是父进程还在运行没有来得及回收.此时这个子进程便是僵尸进程. 但是如果父进程运行完了&#xff0c;也没有回收就直接结束了&#xff0c;那这个子进程改由谁维…

用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版

我们用自定义函数setDocFmt()来实现对公文的排版。 一、获取公文参数值 要对公文进行排版&#xff0c;首先要读取公文“参数设置”区中的参数值。比如公文要求对公文标题的一般规定是&#xff1a;一般用2号小标宋体字&#xff0c;居中显示。标题与正文中间空一行。 这些是“参…

Python控制流程盘点及高级用法、神秘技巧大揭秘!

目录 一、条件语句&#xff08;If-Elif-Else&#xff09; 二、循环结构&#xff08;For和While&#xff09; 三、异常处理&#xff08;Try-Except&#xff09; 四、控制流程的高级用法&#xff01; 1. 列表解析 2. 生成器表达式 3. 装饰器 One More Thing&#xff01;&…

Microsoft 宣布今年底关闭开源软件托管平台 CodePlex

Microsoft 宣布&#xff0c;将关闭开源软件托管平台 CodePlex。Microsoft 2006 年推出这项服务&#xff0c;并决定在今年 12 月 15 日将其关闭。 Microsoft 公司副总裁 Brian Harry 在网上博客中写道&#xff0c;人们将可以下载他们的数据档案&#xff0c;Microsoft 正与面向开…

配电柜实时监测?这也太会省力了吧!

现代企业厂房的安全和效率对于业务的成功至关重要。在这个背景下&#xff0c;配电柜监控成为了一项关键的技术。通过实时监测和管理厂房内的配电柜&#xff0c;企业可以确保电力供应的稳定性&#xff0c;提高能源利用效率&#xff0c;并及时发现和解决潜在的故障和安全风险。 配…

matlab学习指南(2):安装工具箱Toolbox的方法(详细图解)

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…

Uniapp 版本更新

文章目录 前言Uniapp更新确定接口是否能够使用基本代码封装更新软件区别 前言 软件发布之后更新是经常出现的需求。我们希望软件能够自动连网更新软件&#xff0c;而不是重新去手动安装一个apk安装包。不需要更新的软件只有两个&#xff0c;一个是微信小程序&#xff0c;另一个…

openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取

文章目录 openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取概述笔记伺服和配套电机型号官方伺服调试软件笔记H00H01H02H03H04H05H06H07H08H09H0AH0BH0CH0DH0FH11H12H16H17H30H31自定义组备注END openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取 概述 设备中用到了…

学习笔记——vscode界面设置界面缩放级别

使用vscode时&#xff0c;不知道按了什么快捷键&#xff0c;vscode窗口缩放了。 调整方法&#xff1a;设置 > 窗口(window) > Zoom Level

淘宝订单拉取更新历史状态~需求

&#x1f4da;目录 订单接口api需求问题解决 Map<String,TaobaoOrder> 订单接口api 可自行查询官网文档&#xff0c;点击进入 需求 通过接口中has_next 标识判断该时间断是否还有下一页数据,直到该值数据为false时,表面该时间范围内的订单数据获取完成. 拉取完成后需要对…

初阶C语言——指针

Hello&#xff0c;我们又见面了&#xff0c;时间过的好快啊&#xff0c;转眼间也已经写了这么多份博客了&#xff0c;在接下来的一年里&#xff0c;小编也会认真学习的敲代码&#xff0c;我们一起进步&#xff0c;那今天开始讲我们的指针&#xff0c;指针这一章节在C语言的学习…