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

想要精通算法和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 个单位的雨水(蓝色部分表示雨水)。

题目分析:首先我们从图中想一下,积水的条件是什么?对于每一块的积水区域 ,一定是最右侧的柱子高度 >= 最左侧的柱子高度。 同时对于任何一块积水处,一定有三种元素构成:

  • 右墙。
  • 低洼处(中间部位)
  • 左墙。

这三个元素放到一条直线上,当坐标或者索引来看,他就对应了三个索引。那么这种情况下,对于具有一定的高度排序要求的,我们使用单调栈来解决这个问题。思路如下:

  1. 首先,我们需要计算积水的时候,希望当前找到的柱子肯定是前面找的任何柱子要高。那么我们就可以使用单调递减栈。
  2. 只有更低的柱子能够入栈,毕竟单调递减嘛。然后重点来了。当遇到高的柱子了那怎么办?
  3. 假设当前遇到的柱子索引是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 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,…...

Vue3 更高效的构建工具——Vite

文章目录前言一、Vite简介1. Vite组成2.为什么选 Vite?二、Vite的优缺点vite优点vite缺点三、使用Vite创建Vue3项目1. 创建 vite 的项目2.项目的结构前言 本文讲解了构建工具 Vite&#xff0c;目前只有vue3才可以使用Vite&#xff0c;如果本文对你有所帮助请三连支持博主。 下…...

优思学院|從《狂飙》高启强爱看的《孙子兵法》到六西格玛项目管理

近期最受人瞩目的&#xff0c;无疑是电视剧《狂飙》中出类拔萃的反派高启强。而在剧中&#xff0c;指引高启强走向顶峰的&#xff0c;正是那部著名的军事经典——《孙子兵法》。 在剧中&#xff0c;高启强在一次村庄改造项目上遇到了困难&#xff0c;但他仍保持冷静&#xff0…...

如何利用状态机编程实现启保停控制(含Stateflow模型介绍)

状态机的介绍这里不再赘述,概念也很简单没有过多的复杂理论。下面我们直接给出具体实现过程。有限自动状态机详细讲解请参看下面的文章链接: PLC面向对象编程系列之有限状态机(FSM)详解_RXXW_Dor的博客-CSDN博客_有限状态机 plc实现编写PLC控制机器动作类程序时,当分支比较…...

4. sql 语句中常用命令

1. 数据表&#xff1a; 本文中所有命令&#xff0c;测试的数据表结构如下图&#xff1a; 2. 查询语句&#xff1a; 2.1 基础查询&#xff1a;select //查询单个字段&#xff1a; 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&#xff08;CD2207&#xff09;&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87435564 目录SpringBoot集成swagger3&#xff08;CD2207&#xff09;&#…...

Go语言语言学习十三(反射的对象值)

在Go语言中反射不仅可以获取值的类型和种类&#xff0c;还可以获取值和更改值&#xff0c;使用reflect.ValueOf()获取和设置变量的值。 使用反射值包装任意值 Go语言通过reflect.ValueOf()获取的是值的反射值对象&#xff0c;书写格式如下 value : reflect.ValueOf(rawValue…...

【ESP 保姆级教程】玩转emqx数据集成篇② ——控制台输出动作(多用于测试环境调试功能)

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-10 ❤️❤️ 本篇更新记录 2023-02-10 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...

MyBatis案例 | 使用映射配置文件实现CRUD操作——添加数据

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&…...

2023年,什么样的CRM,才是您最需要的?

春节假期刚刚结束&#xff0c;当大家还沉浸在新春佳节的喜悦中时&#xff0c;很多地方已经争先恐后地奋力开跑了。近日&#xff0c;全国各地方政府相继出台并发布了2023年数字化转型规划&#xff0c;纷纷结合自身的区位特色和优势资源&#xff0c;明确2023年乃至此后数年的数字…...

【C语言】编程初学者入门训练(6)

文章目录51. 计算一元二次方程52. 获取月份天数53. 简单计算器54. 线段图案55. 正方形图案56. 直角三角形图案57. 翻转直角三角形图案58. 带空格直角三角形图案59. 金字塔图案60. 翻转金字塔图案51. 计算一元二次方程 问题描述&#xff1a;从键盘输入a, b, c的值&#xff0c;编…...

Java笔记-异常相关

一、异常概述与异常体系结构 Error:Java虚拟机无法解决的严重问题&#xff1a; JVM系统内部错误&#xff0c;资源耗尽&#xff0c;如&#xff1a;StackOverflow \OOM堆栈溢出 处理办法&#xff1a;只能修改代码&#xff0c;不能编写处理异常的代码 Exception:可以处理的异常 &…...

pytest-xdist测试用例并发

官方文档&#xff1a;pytest-xdist初次使用参考&#xff1a;Python测试框架pytest&#xff08;22&#xff09;插件 - pytest-xdist&#xff08;分布式执行&#xff09;pytest测试框架系列 - Pytest pytest-xdist 分布式、多进程并发执行用例你会用吗&#xff1f;Pytest-xdist并…...

大数据---Hadoop安装jdk简易版

编写自动安装jdk的shell脚本 完整流程: 大数据—Hadoop安装教程&#xff08;一&#xff09; 文章目录编写自动安装jdk的shell脚本上传压缩包编写shell脚本vim autoinstall.sh解压更名添加环境运行上传压缩包 在opt目录下创建连个目录install和soft 将压缩包上传到install目录…...

【0基础学爬虫】爬虫基础之爬虫的基本介绍

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…...

Python 数据库开发实战 - Python与Redis交互篇- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis

接下来这个章节将继续来完成 《新闻管理系统》 这个项目&#xff0c;上一章节我们完成了 “发表新闻” 这个功能&#xff0c;在发表新闻后&#xff0c;什么时候才会缓存该条新闻记录呢&#xff1f;并不是说在发表新闻成功之后就立刻被缓存&#xff0c;而是该新闻被管理员审批通…...

Vue拼图验证

vue-puzzle-verification 封装的一个用于登录验证的拼图的vue组件&#xff0c;使用了canvas画图和拖拽的一些技巧。支持大小、形状、图片、偏差、范围的自定义。 一、安装使用 npm install vue-puzzle-verification 二、main.js里引入 import PuzzleVerification from vue…...

这个神器,让 Python 爬虫如此简单

相信大家应该都写过爬虫&#xff0c;简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫&#xff0c;就需要在程序里面加上请求头和参数信息。类似这种&#xff1a; 我们一般的步骤是&#xff0c;先到浏览器的网络请求中找到我们需要的请求&#xff0c;然后将请求头和参数信…...

网络舆情公关必须把握的四项基本原则

在这个网络媒体占主导的时代&#xff0c;舆情公关进入了网络自媒体时代&#xff0c;有时候可能企业认为是小事儿&#xff0c;也可能在网上掀起轩然大波&#xff0c;所以网络舆情优化成为营销推广工作中重要一环。网络舆情优化的目标是让网络舆论对企业经营发展有利的方向发展&a…...

ATE PCB组装:半导体测试中的精密工艺与挑战解析

1. ATE PCB组装&#xff1a;半导体测试的基石与挑战 在半导体行业&#xff0c;一颗芯片从设计到最终封装出厂&#xff0c;其性能与可靠性的验证是决定产品成败的最后一环。随着芯片工艺节点不断微缩&#xff0c;集成度呈指数级增长&#xff0c;对测试环节的要求也达到了前所未有…...

ARM TPIU调试接口原理与应用实践

1. ARM TPIU调试接口深度解析在嵌入式系统开发中&#xff0c;调试接口的设计与实现往往是决定开发效率的关键因素。作为ARM CoreSight调试架构的重要组成部分&#xff0c;Trace Port Interface Unit(TPIU)承担着处理器跟踪数据格式化与输出的核心功能。本文将深入剖析TPIU的寄存…...

视觉语言模型心智理论评估:意图理解与视角采样的能力分离现象

1. 项目概述&#xff1a;当AI“读心术”遇到瓶颈最近在跟进多模态大模型的前沿进展时&#xff0c;一篇来自2025年“心智理论”国际研讨会的论文引起了我的注意。论文标题很有意思&#xff0c;叫《视觉语言模型看到你想看的&#xff0c;而非你看到的》。这个标题精准地概括了当前…...

高精度正弦/余弦插值技术解析与应用

1. 高精度正弦/余弦插值技术概述在工业自动化、电机控制和精密测量领域&#xff0c;位置传感器是核心部件之一。这类传感器通常输出两路相位差90度的正弦和余弦模拟信号&#xff0c;其幅值变化与机械位置或角度呈严格对应关系。如何将这些模拟信号转换为高精度的数字位置信息&a…...

Docker Compose多项目管理利器:compose-skill配置与实战指南

1. 项目概述&#xff1a;一个被低估的Docker Compose技能管理工具如果你和我一样&#xff0c;日常工作中大量使用Docker Compose来编排本地开发环境、测试服务栈&#xff0c;甚至是一些轻量级的生产部署&#xff0c;那你一定遇到过这样的场景&#xff1a;手头同时维护着好几个项…...

AI伦理编程实战:从公平性算法到可解释性模型的工程实践

1. 项目概述&#xff1a;当代码开始思考&#xff0c;我们该教它什么&#xff1f; “AI伦理编程”这个词&#xff0c;听起来像是一个技术乌托邦&#xff0c;一个我们只要遵循几条规则就能让机器变得善良的简单任务。但当你真正坐下来&#xff0c;试图将“公平”、“透明”、“无…...

从零构建智能文档工厂:自动化生成API文档与多格式发布

1. 项目概述&#xff1a;从“文档生成”到“智能文档工厂”在软件开发和团队协作的日常里&#xff0c;文档工作常常被戏称为“脏活累活”。它不像写代码那样有即时的反馈和成就感&#xff0c;但又不可或缺。无论是API接口文档、项目说明、还是内部流程手册&#xff0c;一份清晰…...

Verdi 2017.12实战:一步步教你用UVM Debug Mode追踪寄存器模型与Sequence事务

Verdi 2017.12实战&#xff1a;UVM Debug Mode全流程调试指南 在芯片验证领域&#xff0c;高效的调试能力直接决定项目进度。当测试平台遇到寄存器读写异常或sequence事务不符合预期时&#xff0c;如何快速定位问题根源&#xff1f;Verdi 2017.12提供的UVM Debug Mode正是为解决…...

洛谷 P1333:瑞瑞的木棍 ← 欧拉回路 + 并查集

【题目来源】 https://www.luogu.com.cn/problem/P1333 【题目描述】 瑞瑞有一堆的玩具木棍&#xff0c;每根木棍的两端分别被染上了某种颜色&#xff0c;现在他突然有了一个想法&#xff0c;想要把这些木棍连在一起拼成一条线&#xff0c;并且使得木棍与木棍相接触的两端颜色…...

Linux df 命令深度解析:从磁盘空间监控到 inode 耗尽排查

服务器磁盘满了&#xff0c;SSH 登录都报错 No space left on device。第一反应就是敲 df -h&#xff0c;但有时候明明显示还有空间&#xff0c;却还是报错——这是 inode 耗尽了。深入了解 df 命令后&#xff0c;发现这个看似简单的工具其实藏着不少门道。 df 的底层实现&…...