当前位置: 首页 > news >正文

【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;

参考链接:解法一:按行求

题解二:按列求

求每一列的水,我们只需要关注当前列,以及左边最高的墙,右边最高的墙就够了。
装水的多少,当然根据木桶效应,我们只需要看左边最高的墙和右边最高的墙中较矮的一个就够了。

在这里插入图片描述

  1. 第一个for循环列数(1,2,3,4,5,6,7,8…)
  2. 第二三个for循环,分别求出当前列的左边有右边的最大柱子
  3. 找出两端最矮的,然后减去当前列的柱子高度就是当前列的水量
    参考链接:解法二:按列求
     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. 接雨水

题目 题解一&#xff1a;暴力双重for循环&#xff08;以行计算水量&#xff09; 1.先找出最高的柱子有多高&#xff08;max 3&#xff09; 2.然后第一个for为行数&#xff08;1&#xff0c;2&#xff0c;3&#xff09; 3.第二个for计算每一行的雨水量&#xff08;关键在于去除…...

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提供了强大的焊件功能&#xff0c;可以帮助工程师们以更高的效率设计焊接件。本文将介绍SOLIDWORKS焊件的概念、特点以及使用方法&#xff0c;以期帮助读者更好地理解和应用这一关键技术。 SOLIDWO…...

2023国赛数学建模D题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码&#xff0c;大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…...

git协议实现管理(三个步骤)

GitHub官网访问&#xff1a; https://github.com/dashboard 初次使用git的用户要使用git协议大概需要三个步骤: 一、生成密钥对 二、设置远程仓库(本文以github为例)上的公钥 三、把git的remote url远程仓库URL可访问路径修改为git协议(以上两个步骤初次设置过以后&#xff0c…...

“深入理解JVM:探索Java虚拟机的内部机制“

标题&#xff1a;深入理解JVM&#xff1a;探索Java虚拟机的内部机制 摘要&#xff1a; Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是Java语言的核心&#xff0c;负责将Java源代码编译成可执行的字节码并运行。本篇博客将深入探索JVM的内部机制&a…...

Unity——各种特效的基本使用方法

特效是游戏制作不可或缺的一环&#xff0c;作为游戏开发者最重要的工作就是将特效添加到游戏中&#xff0c;并在合适的时机、合适的位置将特效播放出来&#xff0c;同时还要注意特效的管理和销毁。 某些种类的特效&#xff0c;如动效、贴花&#xff0c;还要编写脚本代码以实现…...

smiley-http-proxy-servlet 实现springboot 反向代理,结合项目鉴权,安全的引入第三方项目服务

项目中反向代理 集成第三方的服务接口或web监控界面&#xff0c;并实现与自身项目相结合的鉴权方法 依赖 smiley-http-proxy-servlet GitHub链接 2.0 版开始&#xff0c;代理切换到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属于多用户多任务操作系统&#xff0c;而Windows属于单用户多任务操作系统Linux一切皆文件目录结构 bin 存储二进制可执行文件dev 存放的是外接设备&#xff0c;例如磁盘&#xff0c;光盘等。在其中的外接设备是不能直接被使用的&…...

GPT-3.5——从 人工智障 到 大人工智障

有人说&#xff0c;GPT是从人工智障到人工智能的蜕变&#xff0c;但是。。。 我认为&#xff0c;GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…...

创建型(四) - 原型模式

一、概念 原型模式&#xff08;Prototype Pattern&#xff09;&#xff1a;利用对已有对象&#xff08;原型&#xff09;进行复制&#xff08;或者叫拷贝&#xff09;的方式来创建新对象&#xff0c;以达到节省创建时间的目的。 使用场景&#xff1a;如果对象的创建成本比较大…...

ABAP 定义复杂的数据结构

最近有个需求是实现ABAP数据类型与JASON类型的转换。想要创建个ABAP的数据类型来接JASON类型是个挺麻烦的事。例如下面这个JASON数据&#xff0c;是个很简单的数据结构。但对ABAP来说有4层了&#xff0c;就有点复杂了。 不过ABAP的数据类型也是支持直接定义数据结构的嵌套的。如…...

HCIP第四节-----------------------------BGP

一、BGP基础 1、BGP得概述 &#xff08;1&#xff09;、AS OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用&#xff0c;随着网络规模扩大&#xff0c;网络中路由数量不断增长&#xff0c;IGP已无法管理大规模网络&#xff0c;AS的概念由此诞生。 AS指的是在同一个组织…...

Temu闯关日韩受挫?跨境电商卖家如何打磨好营销链路

海外版拼多多 Temu 先后在日本和韩国上线&#xff0c;然而效果不似预期&#xff0c;日韩市场对这套“低价补贴”策略并不买账。作为一个尚未被日韩消费者熟悉的网站&#xff0c;其价格之便宜无法让消费者信任。除此之外更大的问题是&#xff0c;在日本卷不过线下零售与百元店&a…...

console的几个常用用法

console.log() 其一、主要表示&#xff1a;向 Web 控制台输出一条消息; 其二、而具体是什么信息就以传递的实参为准&#xff0c;然后就是在控制台就能显示自己传递参数的结果&#xff1b; console.log([1,3,5,7]) // 输出 [1, 3, 5, 7] console.log({}) // 输出 {} conso…...

服务器数据恢复-HP EVA存储VDISK被删除的数据恢复案例

服务器数据恢复环境&#xff1a; 某单位有一台HP EVA存储&#xff0c;连接2组扩展柜&#xff0c;扩展柜中有12块FATA磁盘和10块FC磁盘&#xff0c;不确定数量的LUN&#xff0c;主机安装WINDOWS SERVER操作系统&#xff0c;存储设备用来存放该单位的重要资料。 服务器故障初检&…...

(搜索) 剑指 Offer 13. 机器人的运动范围 ——【Leetcode每日一题】

❓剑指 Offer 13. 机器人的运动范围 难度&#xff1a;中等 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0c;它每次可以向左、右、上、下移动一格&#xff08;不能移动到方格外&#xff09;&…...

Java并发编程之线程池详解

目录 &#x1f433;今日良言:不悲伤 不彷徨 有风听风 有雨看雨 &#x1f407;一、简介 &#x1f407;二、相关代码 &#x1f43c;1.线程池代码 &#x1f43c;2.自定义实现线程池 &#x1f407;三、ThreadPoolExecutor类 &#x1f433;今日良言:不悲伤 不彷徨 有风听风 有…...

开源数据库Mysql_DBA运维实战 (总结)

开源数据库Mysql_DBA运维实战 &#xff08;总结&#xff09; SQL语句都包含哪些类型 DDL DCL DML DQL Yum 安装MySQL的配置文件 配置文件&#xff1a;/etc/my.cnf日志目录&#xff1a;/var/log/mysqld.log错误日志&#xff1a;/var/log/mysql/error.log MySQL的主从切换 查看主…...

图神经网络与分子表征:1. 分子图和图神经网络基础

CSDN的朋友们大家好&#xff0c;好久没写系列文章了。 近期读了很多图神经网络&#xff08;GNN&#xff09;和分子表征&#xff08;molecular representation&#xff09;的论文&#xff0c;正好最近不是很忙&#xff0c;所以我决定把自己的学习过程记录下来&#xff0c;与大家…...

Spring Boot与Redisson的整合。分布式锁

Spring Boot与Redisson的整合可以帮助您在Spring Boot应用程序中使用分布式锁、缓存等功能。下面是一些基本步骤来整合Spring Boot与Redisson&#xff1a; 添加Maven/Gradle依赖&#xff1a; 在您的Spring Boot项目的pom.xml&#xff08;Maven&#xff09;或build.gradle&#…...

Lua中逻辑运算符and,or,not 区别与用法

在Lua中&#xff0c;逻辑运算符包括 and、or 和 not。它们用于对布尔值进行逻辑运算。 and运算符&#xff1a; 当同时满足两个表达式时&#xff0c;返回第二个表达式的值&#xff1b;否则&#xff0c;返回第一个表达式的值。如果第一个表 达式的值为false或nil&#xff0c;则…...

使用 spaCy 增强 NLP 管道

介绍 spaCy 是一个用于自然语言处理 (NLP) 的 Python 库。SpaCy 的 NLP 管道是免费且开源的。开发人员使用它来创建信息提取和自然语言理解系统,例如 Cython。使用该工具进行生产,拥有简洁且用户友好的 API。 如果您处理大量文本,您会想了解更多相关信息。例如,它是关于什…...

【HCIP】08.ISIS中间系统

链路状态协议&#xff0c;传递LSA信息ISIS基于数据链路层封装在OSI时&#xff0c;也有自己的网络层地址和自己的路由协议&#xff0c;即ISIS。之前的ISIS支持OSI的网络层地址&#xff0c;是为OSI中的CLNP&#xff08;无连接网络协议&#xff09;网络设计的路由协议&#xff0c;…...

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 帮你讲论文

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;冰葡美式 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…...

【TypeScript】枚举类型

在 TypeScript 中&#xff0c;枚举&#xff08;Enum&#xff09;是一种用于定义命名常量集合的数据类型。枚举使代码更加可读和可维护&#xff0c;因为它们为一组具有语义的值提供了命名。 以下是 TypeScript 中枚举的基本用法和特点&#xff1a; // 声明一个枚举 enum Direc…...

快速通过华为HCIP认证

你可以按照以下步骤进行准备和学习&#xff1a; 华为认证课程和资料--提取码:1234https://pan.baidu.com/s/1YJhD8QbocHhZ30MvrKm8hg 了解认证要求&#xff1a;查看华为官方网站上的HCIP认证要求和考试大纲&#xff0c;了解考试的内容、考试形式和考试要求。 学习相关知识&am…...

派森 #P124. 公式计算

描述 输入数正整数m&#xff0c;输出0! 1! ...m!的计算结果。 样例 输入 5 输出 154 代码&#xff1a; m int(input()) result 1 factorial 1 for i in range(1, m 1):factorial * iresult factorial print(result) # 法2def factorial(n):"""计…...

常州做网站公司排名/微博搜索引擎优化

原文地址为&#xff1a; ASP.NET Web API系列教程&#xff08;目录&#xff09;注&#xff1a;微软随ASP.NET MVC 4一起还发布了一个框架&#xff0c;叫做ASP.NET Web API。这是一个用来在.NET平台上建立HTTP服务的Web API框架&#xff0c;是微软的又一项令人振奋的技术。目前&…...

做动画在线观看网站/百度推广营销方案

日前&#xff0c;中国工程院王天然院士等撰文&#xff0c;详细阐述了在制造系统结构、设计与制造技术、人机关系方面正在发生的巨大变革&#xff0c;指出以“分散与集中相统一的制造系统、虚实结合的设计与制造手段、人机共融的生产方式”为特征的智能制造空间将快速形成&#…...

写作兼职网站/门户网站有哪些

F12后&#xff0c;切换到手机模式&#xff0c;方向没有鼠标&#xff0c;这对于调试前端页面来说无疑是一大难题&#xff0c;看不见只能盲点&#xff0c; 以为是浏览器问题&#xff0c;清理缓存&#xff0c;升级浏览器&#xff0c;清除插件等都不好使。 后来查到资料说是显卡问题…...

手机网站模板 怎样做/东莞seo报价

描述SWRITE具有与CWRITE类似的功能和语法。但是&#xff0c;与CWRITE不同&#xff0c;SWRITE不会将数据写入通道&#xff0c;而是写入CHAR数组。1. 可以将CWRITE限制为将数据写入通道。 SWRITE可以执行更复杂的格式化任务。这使程序更加灵活。2. CWRITE最多可以处理10个变量。…...

南昌做公司网站哪家好/百度seo工具

承接之前文章使用openresty来搭建https代理与日志打印&#xff0c;随着时间的流逝&#xff0c;我搭建的openresty已经上了公司的生产服务器&#xff0c;就在这周五出现了一个新问题&#xff0c;于是我开始了探索了历程&#xff01;那么问题是什么呢&#xff1f;又是怎么解决的呢…...

长沙公司网站开发/世界营销大师排名

提出问题&#xff1a; 回调函数是基于C编程的Windows SDK的技术&#xff0c;不是针对C的&#xff0c;程序员可以将一个C函数直接作为回调函数&#xff0c;但是如果试图直接使用C的成员函数作为回调函数将发生错误&#xff0c;甚至编译就不能通过。分析原因&#xff1a;普通的C成…...