【力扣算法12】之 11. 盛最多水的容器 python

news2024/12/23 23:26:05

文章目录

  • 问题描述
    • 示例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的长度n
        left, right = 0, n - 1  # 初始化左指针left为0,右指针right为数组最后一个元素的下标n-1
        max_area = 0  # 初始化最大面积max_area为0

        while left < right:  # 进入循环,条件是左指针left小于右指针right
            curr_area = min(height[left], height[right]) * (right - left)  # 计算当前的面积curr_area,即两个指针所指高度较小值乘以两个指针之间的距离
            max_area = max(max_area, curr_area)  # 更新最大面积max_area,通过将当前面积curr_area与max_area比较,并将较大值赋给max_area

            if 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 += 1
                right -= 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.coloradmin.cn/o/754706.html

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

相关文章

SQL 优化换汤不换药的时代变了与SQL审核

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

Kubernetes轻量级日志工具Loki安装及踩坑记录

Loki简介 Loki是Grafana出品的一个轻量级日志系统&#xff0c;熟悉ELK的都知道ELK使用起来的成本&#xff0c;而且仅仅是日志检索使用ELK的话有点大材小用了。Loki8技术栈中使用了以下组件。 Promtail 用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具&#xff0c…

谷歌Bard更新中文支持;GPT-4:1.8万亿参数、混合专家模型揭秘; Meta推出商用版本AI模型

&#x1f989; AI新闻 &#x1f680; 谷歌的AI聊天工具Bard更新&#xff0c;增加中文支持 摘要&#xff1a;谷歌的AI聊天工具Bard新增中文环境&#xff0c;用户可以使用简体和繁体中文进行交流。然而&#xff0c;与竞品相比&#xff0c;Bard的回复略显生硬&#xff0c;语义理…

C# Winfrom将DataGridView数据导入Excel

1.项目添加Word和Excel的COM类型库引用 2.创建Excel工作表 //定义Excel操作对象Microsoft.Office.Interop.Excel.Application excelApp new Microsoft.Office.Interop.Excel.Application();//定义Excel工作表Microsoft.Office.Interop.Excel.Worksheet worksheet excelApp.Wo…

【专题速递】在线K歌、云化XR、咔嚓剪辑和FFmpeg直播能力更新计划

// 在线K歌的技术方案选型有哪些&#xff1f;对于沉浸式XR我们又有什么新的思考&#xff1f;高性能低依赖的剪辑视频需要具备什么技术&#xff1f;7月29日LiveVideoStackCon2023上海站客户端体验与性能优化专场&#xff0c;为您解答。 客户端体验与性能优化 客户端作为直接面…

用Python画一个星空

1 问题 如何用Python画一个简单的星空&#xff1f; 2 方法 在Python中有着各种各样的工具包&#xff0c;比如math、pillow、requests等等&#xff0c;每个包有着自己专门的功能。要用python画星空&#xff0c;在绘制星空的过程中一般需要运用到turtle工具&#xff0c;它是属于P…

PVE虚拟化平台之安装RHEL9系统

PVE虚拟化平台之安装RHEL9系统 一、RHEL9介绍1.1 RHEL9简介1.2 RHEL9新功能 二、上传镜像到PVE存储2.1 检查PVE环境2.2 上传镜像 三、创建虚拟机3.1 设置虚拟机名称3.2 操作系统设置3.3 系统设置3.4 磁盘设置3.5 CPU设置3.6 内存设置3.7 网络设置3.8 确定虚拟机配置 四、安装操…

【刷题】在二叉树中分配硬币

在二叉树中分配硬币 https://leetcode.cn/problems/distribute-coins-in-binary-tree/description/ 描述 给定一个有 N 个结点的二叉树的根结点 root&#xff0c;树中的每个结点上都对应有 node.val 枚硬币&#xff0c;并且总共有 N 枚硬币。 在一次移动中&#xff0c;我们…

PLSQL Developer怎样查看当前活动会话

点‘工具’-‘会话’&#xff1a; 选择‘Active sessions’: 点击某个会话&#xff0c;可以看到其对应的sql&#xff1a;

Feign技术

说明&#xff1a;Feign和RestTemplate一样&#xff0c;是用于微服务之间通信的&#xff0c;配合注册中心技术Nacos&#xff0c;可以搭建一个完整的SpringCloud环境。本文介绍在NacosFeign环境下&#xff0c;Feign的使用。 环境介绍&#xff1a;创建两个服务&#xff0c;订单服…

Web3的2048,Sui 8192能否打开全链游戏的大门?

作者&#xff1a;Peng SUN&#xff0c;Foresight News Sui 8192&#xff1a;一局游戏就是一个NFT Sui 8192智能合约基于Move语言编写&#xff0c;构成非常简单&#xff0c;包括游戏、Game Board与排行榜&#xff08;Leaderboard&#xff09;三部分&#xff0c;覆盖方块移动、…

Linux基本知识/Linux文件夹创建、删除、复制等命令怎么用/grep管道符是啥

前情提要&#xff1a;经过一段时间的沉淀&#xff0c;因为要用到Linux&#xff0c;索性就梳理总结一下Linux的基本知识&#xff01; 一、Linux文件目录 1.1 结构 是一个树形结构&#xff0c;只有一个根目录/ 1.2 路径描述 linux系统中&#xff0c;路径层次关系用/来表示w…

IDEA安装JRebel插件激活LS client not configued问题

JRebel插件安装步骤&#xff1a;settings->Plugins中搜索JRebel&#xff0c;然后安装即可 这里安装的是最新版本&#xff0c;安装完后会要求重启IDEA&#xff0c;重启后一般会自动弹出JRebel面板&#xff0c;里面有个Activation&#xff0c;点击后弹出激活页面&#xff0c;我…

java 通过Json -schema完成对数据的效验

Json -schema 1.对象的效验2.数组套对象的效验3. 字符串的效验长度效验(minLength)(maxLength)正则效验日期和时间 4.对象套对象效验5.对象套数组6. 其他参数required(必须要填&#xff09;enum(范围之内&#xff09;not&#xff08;不&#xff09;anyOf 和allOf&#xff08;双…

C++之重写基类虚函数添加override区别(一百六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

5. MySQL - JDBC SQL 注入 博客系统(万字详解)

目录 1. 介绍 2. 使用 JDBC 连接数据库 2.1 如何使用 JDBC 连接数据库 2.2 导入的各个类 2.3 DataSource 对象的创建 2.4 从 DataSource 对象中得到 Connection 对象 2.5 创建 Statement 对象 2.6 从 ResultSet 中遍历每行结果&#xff0c;从每行中获取每列的值 2.7 代…

Django-linux主机计划任务查看服务

目录 需求 功能介绍 页面效果 代码编写 docker部署 需求 线上主机一百台左右&#xff0c;经常会在某个服务器上放置一些自动化脚本&#xff0c;并配置计划任务&#xff0c;时间长可能忘记计划任务所在服务器&#xff0c;所以开发一个用于收集展示crontab任务的服务 语言框…

Coremail易念:2022年企业邮件钓鱼模拟演练分析报告

以下为精华版阅读&#xff0c;如需下载完整版&#xff0c;关注【CACTER邮件安全】&#xff0c;后台回复关键词【钓鱼报告】即可免费下载。 Coremail&易念科技《2022年企业邮件钓鱼模拟演练分析报告》重磅发布&#xff01;有哪些精华亮点&#xff0c;点击下拉。 一、制造业钓…

opencv-07-感兴趣区域(ROI)

在图像处理过程中&#xff0c;我们可能会对图像的某一个特定区域感兴趣&#xff0c;该区域被称为感兴趣区 域&#xff08;Region of Interest&#xff0c;ROI&#xff09;。在设定感兴趣区域 ROI 后&#xff0c;就可以对该区域进行整体操作。 以下是一些 OpenCV ROI应用场景 …

【测试开发】自动化测试 selenium 篇

目录 一. 什么是自动化测试 二. selenium 1. selenium的工作原理 2. seleniumJava的环境搭建(Chrome浏览器) 三. selenium中常用的API 1. 定位元素 findElement 1.1 css选择语法 1.2 xpath 2. 操作测试对象 2.1 sendKeys-在对象上模拟按键输入 2.2 click-点击对象…