想要精通算法和SQL的成长之路 - 接雨水
想要精通算法和SQL的成长之路 - 接雨水
- 前言
- 一. 接雨水
前言
想要精通算法和SQL的成长之路 - 系列导航
一. 接雨水
原题链接
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

输入: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 个单位的雨水(蓝色部分表示雨水)。
题目分析:首先我们从图中想一下,积水的条件是什么?对于每一块的积水区域 ,一定是最右侧的柱子高度 >= 最左侧的柱子高度。 同时对于任何一块积水处,一定有三种元素构成:
- 右墙。
- 低洼处(中间部位)
- 左墙。
这三个元素放到一条直线上,当坐标或者索引来看,他就对应了三个索引。那么这种情况下,对于具有一定的高度排序要求的,我们使用单调栈来解决这个问题。思路如下:
- 首先,我们需要计算积水的时候,希望当前找到的柱子肯定是前面找的任何柱子要高。那么我们就可以使用单调递减栈。
- 只有更低的柱子能够入栈,毕竟单调递减嘛。然后重点来了。当遇到高的柱子了那怎么办?
- 假设当前遇到的柱子索引是right。如图:

这个时候,就可以开始计算积水处了。我们需要遍历栈内元素。此时我们可以拿到三个坐标(彼此相邻):
- 当前遇到的柱子(右墙):
right。对应高度就是height[right]。 - 低洼柱子:
int bottom = stack.pop()(顺便把他弹出)。对应高度就是height[bottom]。 - 左墙:
int left = stack.peek()。只是读,并为弹出哦。对应高度就是height[left]。
那么这相邻的三个柱子(实际上可能不相邻,但是计算起来的效果是等价的),他们造成的积水区域面积如图:红色框框部分。

- 长:
right-left-1。 - 高:
Math.min(rightHeight,leftHeight) - bottomHeight。 - 面积就是长乘高喽。
那这是和我们就把计算结果累加到总和上。进入下一次栈元素的遍历。遍历条件:当前柱子高度比栈顶柱子高。那么计算方式和上述一致。

当栈顶元素高于当前遇到的柱子,那就退出循环,把当前柱子丢到栈里即可。
那么代码编写起来就容易啦:
public int trap(int[] height) {// 雨水总和int count = 0;// 单调栈,递减LinkedList<Integer> stack = new LinkedList<>();// 当前遍历的下标记为rightfor (int right = 0; right < height.length; right++) {// 当遇到的柱子高度 > 栈顶元素的时候,可以开始计算积水了。需要拿到低洼、左墙、右墙while (!stack.isEmpty() && height[stack.peek()] < height[right]) {Integer bottom = stack.pop();// 低洼下标// 特殊情况,如果没有左墙了就没必要循环了,因为构建不成积水if (stack.isEmpty()) {break;}Integer left = stack.peek();// 左墙下标int leftH = height[left];// 左墙高度int bottomH = height[bottom];// 低洼高度int rightH = height[right];// 右墙高度// 长 * 高 计算积水count += (right - left - 1) * (Math.min(leftH, rightH) - bottomH);}// 入栈,上边的while循环保证了这里入栈后的元素总是单调递减的。因为遇到高的,把比他小的全部给出栈了。stack.push(right);}return count;
}
相关文章:
想要精通算法和SQL的成长之路 - 接雨水
想要精通算法和SQL的成长之路 - 接雨水前言一. 接雨水前言 想要精通算法和SQL的成长之路 - 系列导航 一. 接雨水 原题链接 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 输入:height [0,…...
Vue3 更高效的构建工具——Vite
文章目录前言一、Vite简介1. Vite组成2.为什么选 Vite?二、Vite的优缺点vite优点vite缺点三、使用Vite创建Vue3项目1. 创建 vite 的项目2.项目的结构前言 本文讲解了构建工具 Vite,目前只有vue3才可以使用Vite,如果本文对你有所帮助请三连支持博主。 下…...
优思学院|從《狂飙》高启强爱看的《孙子兵法》到六西格玛项目管理
近期最受人瞩目的,无疑是电视剧《狂飙》中出类拔萃的反派高启强。而在剧中,指引高启强走向顶峰的,正是那部著名的军事经典——《孙子兵法》。 在剧中,高启强在一次村庄改造项目上遇到了困难,但他仍保持冷静࿰…...
如何利用状态机编程实现启保停控制(含Stateflow模型介绍)
状态机的介绍这里不再赘述,概念也很简单没有过多的复杂理论。下面我们直接给出具体实现过程。有限自动状态机详细讲解请参看下面的文章链接: PLC面向对象编程系列之有限状态机(FSM)详解_RXXW_Dor的博客-CSDN博客_有限状态机 plc实现编写PLC控制机器动作类程序时,当分支比较…...
4. sql 语句中常用命令
1. 数据表: 本文中所有命令,测试的数据表结构如下图: 2. 查询语句: 2.1 基础查询:select //查询单个字段: select 字段名 from 表名; //查询多个字段 select 字段名1,字段名2,... from 表名; //查询所…...
第三章 Opencv图像像素操作
目录1.像素1-1.确定像素位置1-2.获取指定像素的像素值1-3.修改像素的BGR值2.用numpy模块操作像素2-1.创建图像1.创建黑白图像2.创建彩色图像3.创建随机图像2-2.拼接图像1.水平拼接hstack()方法2.垂直拼接vstack()方法1.像素 1.像素是构成数字图像的最小单位。每一幅图像都是由M…...
SpringBoot集成swagger3(CD2207)(内含教学视频+源代码)
SpringBoot集成swagger3(CD2207)(内含教学视频源代码) 教学视频源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87435564 目录SpringBoot集成swagger3(CD2207)&#…...
Go语言语言学习十三(反射的对象值)
在Go语言中反射不仅可以获取值的类型和种类,还可以获取值和更改值,使用reflect.ValueOf()获取和设置变量的值。 使用反射值包装任意值 Go语言通过reflect.ValueOf()获取的是值的反射值对象,书写格式如下 value : reflect.ValueOf(rawValue…...
【ESP 保姆级教程】玩转emqx数据集成篇② ——控制台输出动作(多用于测试环境调试功能)
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-10 ❤️❤️ 本篇更新记录 2023-02-10 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...
MyBatis案例 | 使用映射配置文件实现CRUD操作——添加数据
本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址:🔥JavaWeb Java入门篇: 🔥Java基础学习篇 Java进阶学习篇&…...
2023年,什么样的CRM,才是您最需要的?
春节假期刚刚结束,当大家还沉浸在新春佳节的喜悦中时,很多地方已经争先恐后地奋力开跑了。近日,全国各地方政府相继出台并发布了2023年数字化转型规划,纷纷结合自身的区位特色和优势资源,明确2023年乃至此后数年的数字…...
【C语言】编程初学者入门训练(6)
文章目录51. 计算一元二次方程52. 获取月份天数53. 简单计算器54. 线段图案55. 正方形图案56. 直角三角形图案57. 翻转直角三角形图案58. 带空格直角三角形图案59. 金字塔图案60. 翻转金字塔图案51. 计算一元二次方程 问题描述:从键盘输入a, b, c的值,编…...
Java笔记-异常相关
一、异常概述与异常体系结构 Error:Java虚拟机无法解决的严重问题: JVM系统内部错误,资源耗尽,如:StackOverflow \OOM堆栈溢出 处理办法:只能修改代码,不能编写处理异常的代码 Exception:可以处理的异常 &…...
pytest-xdist测试用例并发
官方文档:pytest-xdist初次使用参考:Python测试框架pytest(22)插件 - pytest-xdist(分布式执行)pytest测试框架系列 - Pytest pytest-xdist 分布式、多进程并发执行用例你会用吗?Pytest-xdist并…...
大数据---Hadoop安装jdk简易版
编写自动安装jdk的shell脚本 完整流程: 大数据—Hadoop安装教程(一) 文章目录编写自动安装jdk的shell脚本上传压缩包编写shell脚本vim autoinstall.sh解压更名添加环境运行上传压缩包 在opt目录下创建连个目录install和soft 将压缩包上传到install目录…...
【0基础学爬虫】爬虫基础之爬虫的基本介绍
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学…...
Python 数据库开发实战 - Python与Redis交互篇- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis
接下来这个章节将继续来完成 《新闻管理系统》 这个项目,上一章节我们完成了 “发表新闻” 这个功能,在发表新闻后,什么时候才会缓存该条新闻记录呢?并不是说在发表新闻成功之后就立刻被缓存,而是该新闻被管理员审批通…...
Vue拼图验证
vue-puzzle-verification 封装的一个用于登录验证的拼图的vue组件,使用了canvas画图和拖拽的一些技巧。支持大小、形状、图片、偏差、范围的自定义。 一、安装使用 npm install vue-puzzle-verification 二、main.js里引入 import PuzzleVerification from vue…...
这个神器,让 Python 爬虫如此简单
相信大家应该都写过爬虫,简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫,就需要在程序里面加上请求头和参数信息。类似这种: 我们一般的步骤是,先到浏览器的网络请求中找到我们需要的请求,然后将请求头和参数信…...
网络舆情公关必须把握的四项基本原则
在这个网络媒体占主导的时代,舆情公关进入了网络自媒体时代,有时候可能企业认为是小事儿,也可能在网上掀起轩然大波,所以网络舆情优化成为营销推广工作中重要一环。网络舆情优化的目标是让网络舆论对企业经营发展有利的方向发展&a…...
Alpamayo-R1-10B入门必看:VLA模型与传统端到端/模块化架构的本质差异
Alpamayo-R1-10B入门必看:VLA模型与传统端到端/模块化架构的本质差异 1. 引言:自动驾驶决策的十字路口 想象一下,你正在教一个新手司机开车。传统的方法有两种:一种是让他死记硬背所有交通规则和操作步骤(模块化&…...
java毕业设计基于springboot+vue的自贡恐龙博物馆门户系统
前言 该系统采用前后端分离 的架构模式,后端使用Spring Boot框架构建,前端则使用Vue.js等框架来构建友好的用户界面。这种架构模式使得开发团队可以独立进行前后端的开发与维护,从而提高开发效率。一、项目介绍 开发语言:Java 框架…...
ChatTTS流式音频合成实战:从原理到高并发优化
最近在做一个智能客服项目,需要将AI生成的文本实时转换成语音播报给用户。一开始我们用的是传统的TTS服务,文本传过去,等它全部合成完,再把整个音频文件返回。在用户量不大的时候还好,但一到高峰期,问题就全…...
sdkman 一键切换 JDK 版本管理工具
👉 这是一个或许对你有用的社群🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 《项目实战(视频)》:从书中学,往事中…...
使用 Java 泛型创建 CSV 到对象的转换器
本文将介绍如何使用它 Java 创建一个通用的泛型 CSV 文件到 Java 对象转换器。通过泛型,我们可以避免为每个需要转换的类别编写重复的代码,以实现代码的重用和简化。本文将提供示例代码,并讨论一些关于代码设计和最佳实践的建议,以…...
Arduino轻量级软件消抖库FTDebouncer原理与应用
1. 项目概述Future Tailors’ Debouncer(简称 FTDebouncer)是一个专为 Arduino 平台设计的轻量级、高效率、低资源占用的软件消抖库。其核心目标是解决嵌入式开发中一个看似简单却极易出错的基础问题:机械按键或开关引脚的硬件抖动࿰…...
Wan2.2-I2V-A14B企业级落地:API服务压测报告(QPS 3.2,延迟<1.8s)
Wan2.2-I2V-A14B企业级落地:API服务压测报告(QPS 3.2,延迟<1.8s) 1. 测试环境与配置 1.1 硬件配置 GPU:RTX 4090D 24GB显存(专用优化版)CPU:10核心处理器内存:120G…...
nli-distilroberta-base企业实操:政务问答系统中立性与矛盾识别模块
nli-distilroberta-base企业实操:政务问答系统中立性与矛盾识别模块 1. 项目概述 在政务问答系统开发中,准确判断用户提问与政策条文之间的关系至关重要。nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)服务,专门用于分…...
低代码自动化:OpenClaw+百川2-13B可视化流程搭建入门
低代码自动化:OpenClaw百川2-13B可视化流程搭建入门 1. 为什么选择OpenClaw进行低代码自动化? 去年夏天,我接手了一个小型电商项目的运营工作。每天需要手动检查30多个竞品的价格变动,记录到Excel再分析趋势。重复劳动两周后&am…...
ElasticJob HTTP作业:RESTful接口调度的终极指南
ElasticJob HTTP作业:RESTful接口调度的终极指南 ElasticJob是ShardingSphere生态中一款分布式任务调度解决方案,它提供了丰富的作业类型支持,其中HTTP作业是实现跨系统任务调度的理想选择。通过HTTP作业,您可以轻松实现基于REST…...
