Python算法题集_接雨水

     本文为Python算法题集之一的代码示例

     题目42:接雨水

     说明:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水

示例 1:

img

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

     注意:代码运行速度每次都不同,估计服务器负载有波动

  1. 分层双指针,差强人意

    ​      对图像进行分析,接雨水后高度为n+1的雨水一定在高度为n的雨水底座之上,类似金字塔;因此按高度分层,左右指针逐步向中间靠拢,最后得出雨水面积。此算法较为复杂,最终效果也差强人意。
    在这里插入图片描述

    def trapRainWater_ext1(height):     # 分层双指针,按高度逐层上升ilen = len(height)ileft, iright, iSumbottom, iSumlevel, iLevel = 0, ilen - 1, 0, 0, 1while (ileft <= iright):while (ileft <= iright and height[ileft] < iLevel):iSumbottom += height[ileft]ileft += 1while (iright >= ileft and height[iright] < iLevel):iSumbottom += height[iright]iright -= 1iLevel += 1iSumlevel += iright - ileft + 1return iSumlevel - iSumbottomprint(trapRainWater_ext1([0,1,0,2,1,0,1,3,2,1,2,1]))
    # 运行结果
    6
    
  2. 几何裁剪,数学之美,超越93%

    基于几何图像分析,从左向右投射到最高峰,从右向左投射到最高峰,这两个面积相加,减去最高峰*宽的最高峰面积,就是装满雨水后的轮廓面积;这个轮廓面积再减去底座面积,就得出雨水占据的面积。

     此算法简洁优雅,寥寥数行,速度居然超越93%的通过者
     原来科学的尽头是玄学,美学的尽头是数学
在这里插入图片描述

def trapRainWater_ext2(height): # 雨水面积=左边投射面积+右边投射面积-最高峰面积-底座面积result, hleft, hright = 0, 0, 0for iIdx in range(len(height)):hleft = max(hleft, height[iIdx])hright = max(hright, height[-iIdx - 1])result += hleft + hright - height[iIdx]return result - len(height) * hleftprint(trapRainWater_ext2([0,1,0,2,1,0,1,3,2,1,2,1]))
# 运行结果
6
  1. 双指针法,超越93%

    ​      抛弃高度分层的思路,直接使用左右指针相互靠拢;相当于去掉了一个中间层。轻装上阵后,效果也大大提高,代码虽然没有数学家优雅,效率也是超越了93%的通过者
    在这里插入图片描述

    def traRainWater_ext3(height):  # 双指针收缩iLen = len(height)result, ileft, ileftMax, iright, irightMax= 0, 0, 0, iLen - 1, 0while ileft < iright:ileftMax = max(ileftMax, height[ileft])irightMax = max(irightMax, height[iright])if height[ileft] < height[iright]:result += ileftMax - height[ileft]ileft += 1else:result += irightMax - height[iright]iright -= 1return resultprint(trapRainWater_ext3([0,1,0,2,1,0,1,3,2,1,2,1]))
    # 运行结果
    6
    
  2. 堆栈大法超越97%

    ​      堆栈是编译原理中最常见的数据结构,采用堆栈来读取数组,精准分析雨水槽位置和面积,形成了降维打击。此算法超越97%的通过者,可谓是堆栈一出,谁与争锋
    在这里插入图片描述

    def trapRainWater_ext4(height):     # 使用堆栈计算雨水槽stackDef = []res = 0for iIdx in range(len(height)):while stackDef and height[iIdx] > height[stackDef[-1]]:cur = stackDef.pop()if not stackDef:breakiHeight = min(height[iIdx], height[stackDef[-1]]) - height[cur]iWidth = iIdx - stackDef[-1] - 1res += iHeight * iWidthstackDef.append(iIdx)return resprint(trapRainWater_ext4([0,1,0,2,1,0,1,3,2,1,2,1]))
    # 运行结果
    6
    

    一日练,一日功,一日不练十日空

    may the odds be ever in your favor ~

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

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

相关文章

VMware虚拟机部署Linux Ubuntu系统

本文介绍基于VMware Workstation Pro虚拟机软件&#xff0c;配置Linux Ubuntu操作系统环境的方法。 首先&#xff0c;我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是&#xff0c;VMware Workstation Pro软件是一个收费软件&#xff0c;而互联网中有很…

Windows10上通过MSYS2编译FFmpeg 6.1.1源码操作步骤

1.从github上clone代码&#xff0c;并切换到n6.1.1版本&#xff1a;clone到D:\DownLoad目录下 git clone https://github.com/FFmpeg/FFmpeg.git git checkout n6.1.1 2.安装MSYS2并编译FFmpeg源码: (1).从https://www.msys2.org/ 下载msys2-x86_64-20240113.exe &#…

【揭秘】ForkJoinTask全面解析

内容摘要 ForkJoinTask的显著优点在于其高效的并行处理能力&#xff0c;它能够将复杂任务拆分成多个子任务&#xff0c;并利用多核处理器同时执行&#xff0c;从而显著提升计算性能&#xff0c;此外&#xff0c;ForkJoinTask还提供了简洁的API和强大的任务管理机制&#xff0c…

pytorch-metric-learning度量学习工具官方文档翻译

基于Pytorch实现的度量学习方法 开源代码&#xff1a;pytorch-metric-learning官网文档&#xff1a;PyTorch Metric Learning官方文档 度量学习相关的损失函数介绍&#xff1a; 度量学习DML之Contrastive Loss及其变种度量学习DML之Triplet Loss度量学习DML之Lifted Structu…

生信技能树--转录组--个人笔记

这周主要内容是学习转录组的比对&#xff0c;选择的软件为hisat2&#xff0c;该笔记仅供个人参考谨慎搬运代码。 # hisat2 可以快速准确地将测序得到的 RNA 片段&#xff08;reads&#xff09;比对到参考基因组&#xff0c;从而确定这些RNA 片段在基因组上的精确位置&#xff…

关于在Ubuntu20.04(ROS1 noetic)中使用catkin_make编译时发生的与pyhton版本不兼容的问题解决办法

今天在另外一台电脑上操作复现【ROS建模&#xff1a;一起从零手写URDF模型】这个博客时&#xff0c;发生了一些问题&#xff0c;特此记录下来 【ROS建模&#xff1a;一起从零手写URDF模型】链接&#xff1a;https://blog.csdn.net/qq_54900679/article/details/135726348?spm…

redis-主从复制

1.主从复制 1.1简介 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 1.2作用 1、数据冗余&#xff1a;主从复制实现了数据的热备份&#xff0c;是持久化之外的一种数据冗余方式。 2、故…

C++初识类和对象

目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1访问限定符4.2封装 5.类的作用域6.类的实例化7.类的对象大小的计算7.1如何计算类对象的大小7.2类对象的存储方式猜测 7.3 结构体内存对齐规则8.类成员函数的this指针8.1 this指针的引出8.2this…

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]

阅读导航 引言一、特殊类 --- 不能被拷贝的类1. C98方式&#xff1a;2. C11方式&#xff1a; 二、特殊类 --- 只能在堆上创建对象的类三、特殊类 --- 只能在栈上创建对象的类四、特殊类 --- 不能被继承的类1. C98方式2. C11方法 总结温馨提示 引言 在面向对象编程中&#xff0…

Redis核心技术与实战【学习笔记】 - 3.Redis服务高可靠

1.数据同步&#xff1a;主从库如何实现数据一致&#xff1f; 前面我们学习了 AOF 和 RDB&#xff0c;如果 Redis 发生了宕机&#xff0c;它们可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据&#xff0c;从而保证尽量较少丢失数据&#xff0c;提升可靠性。 不过&…

JVM内存模型介绍

JVM最常见的三种有&#xff1a; 1.Sun公司的 HotSpot&#xff0c;是目前使用最广泛的Java虚拟机。 2.BEA公司的 JRockit&#xff0c;后来被 Oracle收购。 3.IBM公司的 J9VM。 我们知道&#xff0c;Java的口号是&#xff1a; “Write once, run anywhere”&#xff0c;即一次编…

Adobe ColdFusion 任意文件读取漏洞复现(CVE-2023-26361)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion平台 filemanager.cfc接口存在任意文件读取漏洞,攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配…

uniapp canvas做的刮刮乐解决蒙层能自定义图片

最近给湖南中烟做元春活动&#xff0c;一个月要开发4个小活动&#xff0c;这个是其中一个难度一般&#xff0c;最难的是一个类似鲤鱼跃龙门的小游戏&#xff0c;哎&#xff0c;真实为难我这个“拍黄片”的。下面是主要代码。 <canvas :style"{width:widthpx,height:hei…

数据结构——顺序表和链表的比较

1.逻辑结构 顺序表和链表都属于线性表&#xff0c;都是线性结构 2.存储结构 顺序表&#xff1a;顺序存储 优点&#xff1a;支持随机存取&#xff0c;存储密度高 缺点&#xff1a;大片连续空间分配不方便&#xff0c;改变容量不方便 链表&#xff1a;链式存储 优点&#…

如何实现无公网IP实现远程访问MongoDB文件数据库

&#x1f4d1;前言 本文主要是如何实现无公网IP实现远程访问MongoDB文件数据库的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x…

MyBatis详解(2)-- mybatis配置文件

MyBatis详解&#xff08;2&#xff09; mybatis配置文件 mybatis配置文件 1.构建SqlSessionFactory的依据。 2.MyBatis最为核心的内容&#xff0c;对MyBatis的使用影响很大。 3.配置文件的层次顺序不能颠倒&#xff0c;一旦颠倒会出现异常。 < c o n f i g u r a t i o n…

大数据就业方向-(工作)ETL开发

上一篇文章&#xff1a; 大数据 - 大数据入门第一篇 | 关于大数据你了解多少&#xff1f;-CSDN博客 目录 &#x1f436;1.ETL概念 &#x1f436;2. ETL的用处 &#x1f436;3.ETL实现方式 &#x1f436;4. ETL体系结构 &#x1f436;5. 什么是ETL技术&#xff1f; &…

【JavaWeb】监听器 Listener

文章目录 一、监听器是什么二、监听器的分类三、监听器的六个主要接口3.1 application域监听器测试代码 :3.1.1 定义监听器3.1.2 定义触发监听器的代码 3.2 session域监听器测试代码 :3.2.1 定义监听器3.2.2 定义触发监听器的代码 3.3 request域监听器测试代码&#xff1a;3.3.…

套接字的多种可选项(修改IO缓冲区大小及TCP_NODELAY)

标题套接字的多种可选项 我们进行套接字编程时往往只关注数据通信&#xff0c;而忽略了套接字具有的不同特性。但是&#xff0c;理解这些特性并根据实际需要进行更改也十分重要。 从上表可以看出&#xff0c;套接字可选项是分层的。IPPROTOIP层可选项是IP协议相关事项&#x…

OpenAI 降低价格并修复拒绝工作的“懒惰”GPT-4,另外ChatGPT 新增了两个小功能

OpenAI降低了GPT-3.5 Turbo模型的API访问价格&#xff0c;输入和输出价格分别降低了50%和25%。这对于使用API进行文本密集型应用程序的用户来说是一个好消息。 OpenAI官网&#xff1a;OpenAI AIGC专区&#xff1a;aigc 教程专区&#xff1a;AI绘画&#xff0c;AI视频&#x…