【LeetCode-困难题】42. 接雨水
题目
题解一:暴力双重for循环(以行计算水量)
1.先找出最高的柱子有多高(max = 3)
2.然后第一个for为行数(1,2,3)
3.第二个for计算每一行的雨水量(关键在于去除前面的空白区域)利用标志位
boolean iscup = true; //标志位,若第一次就少于本次最高水位,则直接跳过,如果是因为处在1 0 1谷底的0就得算水量
4.最后将每一行计算完的雨水量sum总和
//方法一:以行计算水量int sum = 0;//最终总和int maxdepth = max(height);//1-3列for(int i = 1;i<=maxdepth;i++){int temp = 0;boolean iscup = true; //标志位,若第一次就少于本次最高水位,则直接跳过,如果是因为处在1 0 1谷底的0就得算水量//遍历整个数组for(int j=0;j<height.length;j++){//如果小于当前水位,则不更新任何数据 要保证不开始计算水位 才算 if(height[j]<i&&iscup) {continue;}else if(height[j]<i&&!iscup){//根据标志位来判断要不要计算水量temp = temp + 1;} if(height[j]>=i){sum = sum + temp; //把每次累计的temp加到 sumtemp = 0;//计算完水量,重置tempiscup = false;//更新标志位}}}return sum;
参考链接:解法一:按行求
题解二:按列求
求每一列的水,我们只需要关注当前列,以及左边最高的墙,右边最高的墙就够了。
装水的多少,当然根据木桶效应,我们只需要看左边最高的墙和右边最高的墙中较矮的一个就够了。
- 第一个for循环列数(1,2,3,4,5,6,7,8…)
- 第二三个for循环,分别求出当前列的左边有右边的最大柱子
- 找出两端最矮的,然后减去当前列的柱子高度就是当前列的水量
参考链接:解法二:按列求
int sum = 0;//最后的水量//最两端的列不用考虑,因为一定不会有水。所以下标从 1 到 length - 2for(int i=1; i< height.length-1 ; i++){//找出左边最高int maxleft = 0;for(int j = i-1;j>=0;j--){ //由当前数往前找if(maxleft<height[j]) maxleft = height[j];}//找出右边最高int maxright = 0;for(int s = i+1;s<height.length;s++){ //由当前数往后找if(maxright<height[s]) maxright = height[s];}//找出两端最矮的int min = Math.min(maxleft,maxright);if(min > height[i]){sum = sum + (min - height[i]);//核心就是让两端最小的柱子减去柱子,若大于0,差值就是当前列的水量}}return sum;
题解三:动态规划
与上面题解二对比,会发现,每次对一列去求左右最大的柱子时,都会循环一遍左右两边的元素,导致会有很多重复操作,
可以使用动态规划,直接求出每一列的左边或右边的最大柱子
核心:
int sum = 0;int[] maxleft = new int[height.length]; //用于存放i位置的左边的最大柱子int[] maxright = new int[height.length];//用于存放i位置的右边的最大柱子//注意边界问题 原则第一个柱子靠左最长柱子默认为0 则i从1开始,结束位置为倒数第二个,看图好理解for(int i=1;i<height.length-1;i++){//它后边的墙的右边的最高高度和它后边的墙的高度选一个较大的,就是当前列右边最高的墙了。maxleft[i] = Math.max(maxleft[i-1],height[i-1]);}for(int j = height.length-2;j>=0;j-- ){//它后边的墙的右边的最高高度和它后边的墙的高度选一个较大的,就是当前列右边最高的墙了。maxright[j] = Math.max(maxright[j+1],height[j+1]);}for(int i = 1;i<height.length-1;i++){int min = Math.min(maxleft[i],maxright[i]);if(min>height[i]) sum = sum +(min -height[i]);}return sum;
题解四:双指针
动态规划中,我们常常可以对空间复杂度进行进一步的优化。
例如这道题中,可以看到,max_left [ i ] 和 max_right [ i ] 数组中的元素我们其实只用一次,然后就再也不会用到了。所以我们可以不用数组,只用一个元素就行了。我们先改造下 max_left。
动态图解链接:图解接雨水双指针
参考链接:解法四:双指针
int maxLeft = height[0]; int maxRight = height[height.length -1];int left = 1;int right = height.length -2;int sum = 0;for(int i = 1 ; i <height.length -1;i++){// while (left <= right) {//从左开始if(height[left - 1] < height[right + 1]){maxLeft = Math.max(maxLeft,height[left]);if(maxLeft > height[left]){sum = sum + (maxLeft - height[left]);}left++;}else {//从右开始maxRight = Math.max(maxRight,height[right]);if(maxRight > height[right]) {sum = sum + (maxRight - height[right]);} right--;}}return sum;
题解五:栈
参考视频:单调栈,经典来袭!LeetCode:42.接雨水
参考链接:代码随想录-接雨水
if(height.length<=2) return 0;int sum = 0;Stack<Integer> stack = new Stack<>();int current = 0;//先把第一个元素下标加入栈stack.push(0);for(int i=1;i<height.length;i++){//如果要入栈的元素小于栈顶元素,则一直入栈if(!stack.empty()&&(height[i] <= height[stack.peek()])) {stack.push(i);}//如果入栈的元素栈顶元素相等,可以直接入栈,也可以先把栈顶元素出栈,再让重复的元素进栈,只是重复元素入栈到时候计算面积等于0,不影响结果else{while(!stack.empty()&&height[i] > height[stack.peek()]){int mid = stack.pop();if(!stack.empty()){int h = Math.min(height[stack.peek()],height[i]) - height[mid];int w = i - stack.peek() - 1;sum = sum + (h*w);}}stack.push(i);}}return sum;
相关文章:
【LeetCode-困难题】42. 接雨水
题目 题解一:暴力双重for循环(以行计算水量) 1.先找出最高的柱子有多高(max 3) 2.然后第一个for为行数(1,2,3) 3.第二个for计算每一行的雨水量(关键在于去除…...
npm install 安装依赖,报错 Host key verification failed
设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…...
SOLIDWORKS焊件是什么?
SOLIDWORKS是一款广泛应用于机械设计领域的三维计算机辅助设计软件。SOLIDWORKS提供了强大的焊件功能,可以帮助工程师们以更高的效率设计焊接件。本文将介绍SOLIDWORKS焊件的概念、特点以及使用方法,以期帮助读者更好地理解和应用这一关键技术。 SOLIDWO…...
2023国赛数学建模D题思路模型代码 高教社杯
本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…...
git协议实现管理(三个步骤)
GitHub官网访问: https://github.com/dashboard 初次使用git的用户要使用git协议大概需要三个步骤: 一、生成密钥对 二、设置远程仓库(本文以github为例)上的公钥 三、把git的remote url远程仓库URL可访问路径修改为git协议(以上两个步骤初次设置过以后,…...
“深入理解JVM:探索Java虚拟机的内部机制“
标题:深入理解JVM:探索Java虚拟机的内部机制 摘要: Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心,负责将Java源代码编译成可执行的字节码并运行。本篇博客将深入探索JVM的内部机制&a…...
Unity——各种特效的基本使用方法
特效是游戏制作不可或缺的一环,作为游戏开发者最重要的工作就是将特效添加到游戏中,并在合适的时机、合适的位置将特效播放出来,同时还要注意特效的管理和销毁。 某些种类的特效,如动效、贴花,还要编写脚本代码以实现…...
smiley-http-proxy-servlet 实现springboot 反向代理,结合项目鉴权,安全的引入第三方项目服务
项目中反向代理 集成第三方的服务接口或web监控界面,并实现与自身项目相结合的鉴权方法 依赖 smiley-http-proxy-servlet GitHub链接 2.0 版开始,代理切换到jakarta servlet-api<!--HTTP 代理 Servlet--><dependency><groupId>org.mit…...
(vue)多级表头且转为百分比显示
(vue)多级表头且转为百分比显示 <el-table-column align"center" label"近三个月数据情况"><el-table-column align"center" prop"amount" :label"tableLast[0]"><template slot-scope"{ row }"&g…...
Linux下C++开发
Linux下C开发 Linux 系统介绍 简介 Linux属于多用户多任务操作系统,而Windows属于单用户多任务操作系统Linux一切皆文件目录结构 bin 存储二进制可执行文件dev 存放的是外接设备,例如磁盘,光盘等。在其中的外接设备是不能直接被使用的&…...
GPT-3.5——从 人工智障 到 大人工智障
有人说,GPT是从人工智障到人工智能的蜕变,但是。。。 我认为,GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…...
创建型(四) - 原型模式
一、概念 原型模式(Prototype Pattern):利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。 使用场景:如果对象的创建成本比较大…...
ABAP 定义复杂的数据结构
最近有个需求是实现ABAP数据类型与JASON类型的转换。想要创建个ABAP的数据类型来接JASON类型是个挺麻烦的事。例如下面这个JASON数据,是个很简单的数据结构。但对ABAP来说有4层了,就有点复杂了。 不过ABAP的数据类型也是支持直接定义数据结构的嵌套的。如…...
HCIP第四节-----------------------------BGP
一、BGP基础 1、BGP得概述 (1)、AS OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用,随着网络规模扩大,网络中路由数量不断增长,IGP已无法管理大规模网络,AS的概念由此诞生。 AS指的是在同一个组织…...
Temu闯关日韩受挫?跨境电商卖家如何打磨好营销链路
海外版拼多多 Temu 先后在日本和韩国上线,然而效果不似预期,日韩市场对这套“低价补贴”策略并不买账。作为一个尚未被日韩消费者熟悉的网站,其价格之便宜无法让消费者信任。除此之外更大的问题是,在日本卷不过线下零售与百元店&a…...
console的几个常用用法
console.log() 其一、主要表示:向 Web 控制台输出一条消息; 其二、而具体是什么信息就以传递的实参为准,然后就是在控制台就能显示自己传递参数的结果; console.log([1,3,5,7]) // 输出 [1, 3, 5, 7] console.log({}) // 输出 {} conso…...
服务器数据恢复-HP EVA存储VDISK被删除的数据恢复案例
服务器数据恢复环境: 某单位有一台HP EVA存储,连接2组扩展柜,扩展柜中有12块FATA磁盘和10块FC磁盘,不确定数量的LUN,主机安装WINDOWS SERVER操作系统,存储设备用来存放该单位的重要资料。 服务器故障初检&…...
(搜索) 剑指 Offer 13. 机器人的运动范围 ——【Leetcode每日一题】
❓剑指 Offer 13. 机器人的运动范围 难度:中等 地上有一个 m 行 n 列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外)&…...
Java并发编程之线程池详解
目录 🐳今日良言:不悲伤 不彷徨 有风听风 有雨看雨 🐇一、简介 🐇二、相关代码 🐼1.线程池代码 🐼2.自定义实现线程池 🐇三、ThreadPoolExecutor类 🐳今日良言:不悲伤 不彷徨 有风听风 有…...
开源数据库Mysql_DBA运维实战 (总结)
开源数据库Mysql_DBA运维实战 (总结) SQL语句都包含哪些类型 DDL DCL DML DQL Yum 安装MySQL的配置文件 配置文件:/etc/my.cnf日志目录:/var/log/mysqld.log错误日志:/var/log/mysql/error.log MySQL的主从切换 查看主…...
图神经网络与分子表征:1. 分子图和图神经网络基础
CSDN的朋友们大家好,好久没写系列文章了。 近期读了很多图神经网络(GNN)和分子表征(molecular representation)的论文,正好最近不是很忙,所以我决定把自己的学习过程记录下来,与大家…...
Spring Boot与Redisson的整合。分布式锁
Spring Boot与Redisson的整合可以帮助您在Spring Boot应用程序中使用分布式锁、缓存等功能。下面是一些基本步骤来整合Spring Boot与Redisson: 添加Maven/Gradle依赖: 在您的Spring Boot项目的pom.xml(Maven)或build.gradle&#…...
Lua中逻辑运算符and,or,not 区别与用法
在Lua中,逻辑运算符包括 and、or 和 not。它们用于对布尔值进行逻辑运算。 and运算符: 当同时满足两个表达式时,返回第二个表达式的值;否则,返回第一个表达式的值。如果第一个表 达式的值为false或nil,则…...
使用 spaCy 增强 NLP 管道
介绍 spaCy 是一个用于自然语言处理 (NLP) 的 Python 库。SpaCy 的 NLP 管道是免费且开源的。开发人员使用它来创建信息提取和自然语言理解系统,例如 Cython。使用该工具进行生产,拥有简洁且用户友好的 API。 如果您处理大量文本,您会想了解更多相关信息。例如,它是关于什…...
【HCIP】08.ISIS中间系统
链路状态协议,传递LSA信息ISIS基于数据链路层封装在OSI时,也有自己的网络层地址和自己的路由协议,即ISIS。之前的ISIS支持OSI的网络层地址,是为OSI中的CLNP(无连接网络协议)网络设计的路由协议,…...
Android 13 Framework 添加自定义的系统服务CustomService
目的: 添加自定义的系统服务,在自定义的服务中开发定制的API接口和功能,独立于系统核心服务,方便开发和维护。 开发环境:Android 13 MTK平台 涉及修改的文件如下 device/mediatek/sepolicy/base/private/service_contexts device/mediatek/sepolicy/base/vendor/platfo…...
前端食堂技术周刊第 95 期:Fresh 1.4、Rollup 迁移至 SWC计划、RSC Devtools、使用开源库的边界、AI 帮你讲论文
美味值:🌟🌟🌟🌟🌟 口味:冰葡美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…...
【TypeScript】枚举类型
在 TypeScript 中,枚举(Enum)是一种用于定义命名常量集合的数据类型。枚举使代码更加可读和可维护,因为它们为一组具有语义的值提供了命名。 以下是 TypeScript 中枚举的基本用法和特点: // 声明一个枚举 enum Direc…...
快速通过华为HCIP认证
你可以按照以下步骤进行准备和学习: 华为认证课程和资料--提取码:1234https://pan.baidu.com/s/1YJhD8QbocHhZ30MvrKm8hg 了解认证要求:查看华为官方网站上的HCIP认证要求和考试大纲,了解考试的内容、考试形式和考试要求。 学习相关知识&am…...
派森 #P124. 公式计算
描述 输入数正整数m,输出0! 1! ...m!的计算结果。 样例 输入 5 输出 154 代码: m int(input()) result 1 factorial 1 for i in range(1, m 1):factorial * iresult factorial print(result) # 法2def factorial(n):"""计…...
常州做网站公司排名/微博搜索引擎优化
原文地址为: ASP.NET Web API系列教程(目录)注:微软随ASP.NET MVC 4一起还发布了一个框架,叫做ASP.NET Web API。这是一个用来在.NET平台上建立HTTP服务的Web API框架,是微软的又一项令人振奋的技术。目前&…...
做动画在线观看网站/百度推广营销方案
日前,中国工程院王天然院士等撰文,详细阐述了在制造系统结构、设计与制造技术、人机关系方面正在发生的巨大变革,指出以“分散与集中相统一的制造系统、虚实结合的设计与制造手段、人机共融的生产方式”为特征的智能制造空间将快速形成&#…...
写作兼职网站/门户网站有哪些
F12后,切换到手机模式,方向没有鼠标,这对于调试前端页面来说无疑是一大难题,看不见只能盲点, 以为是浏览器问题,清理缓存,升级浏览器,清除插件等都不好使。 后来查到资料说是显卡问题…...
手机网站模板 怎样做/东莞seo报价
描述SWRITE具有与CWRITE类似的功能和语法。但是,与CWRITE不同,SWRITE不会将数据写入通道,而是写入CHAR数组。1. 可以将CWRITE限制为将数据写入通道。 SWRITE可以执行更复杂的格式化任务。这使程序更加灵活。2. CWRITE最多可以处理10个变量。…...
南昌做公司网站哪家好/百度seo工具
承接之前文章使用openresty来搭建https代理与日志打印,随着时间的流逝,我搭建的openresty已经上了公司的生产服务器,就在这周五出现了一个新问题,于是我开始了探索了历程!那么问题是什么呢?又是怎么解决的呢…...
长沙公司网站开发/世界营销大师排名
提出问题: 回调函数是基于C编程的Windows SDK的技术,不是针对C的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C的成员函数作为回调函数将发生错误,甚至编译就不能通过。分析原因:普通的C成…...