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

【力扣】42. 接雨水 <模拟、双指针、单调栈>

【力扣】42. 接雨水

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

目录

    • 【力扣】42. 接雨水
    • 题解
        • 暴力
        • 双指针
        • 单调栈

示例 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 个单位的雨水(蓝色部分表示雨水)。

示例 2:
输入:height = [4,2,0,3,2,5]
输出:9

提示:
n == height.length
1 <= n <= 2 * 1 0 4 10^4 104
0 <= height[i] <= 1 0 5 10^5 105

题解

暴力

按照列来计算的话,宽度一定是1,把每一列的雨水的高度求出来即可。
每一列雨水的高度,取决于该列左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。
min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度
min(lHeight, rHeight) - height
在这里插入图片描述

public class Solution {public int trap(int[] height) {int sumWater = 0;for (int i = 0; i < height.length; i++) {// 第一个柱子和最后一个柱子不接雨水if (i==0 || i== height.length - 1) {continue;}// 记录右边柱子的最高高度int rHeight = height[i];// 记录左边柱子的最高高度int lHeight = height[i];// 求左边最高柱子for (int l = i-1; l >= 0; l--) {if(height[l] > lHeight) {lHeight = height[l];}}// 求右边最高柱子for (int r = i+1; r < height.length; r++) {if (height[r] > rHeight) {rHeight = height[r];}}//每一列雨水的高度,取决于,该列左侧最高的柱子和右侧最高的柱子中 最矮的那个柱子的高度。int h = Math.min(lHeight, rHeight) - height[i];if (h > 0) {sumWater += h;}}return sumWater;}
}

双指针

每到一个柱子都向两边遍历一遍,这其实是有重复计算的,为了得到两边的最高高度,使用了双指针来遍历。把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),这样就避免了重复计算。

当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。当前位置,右边的最高高度是前一个位置的右边最高高度和本高度的最大值。

public class Solution {public int trap(int[] height) {// 每到一个柱子都向两边遍历一遍,这其实是有重复计算// 把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight)int[] maxLeft = new int[height.length];int[] maxRight = new int[height.length];// 记录每个柱子左边柱子最大高度maxLeft[0] = height[0];for (int i = 1; i < height.length; i++) {//当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值maxLeft[i] = Math.max(height[i], maxLeft[i - 1]);}// 记录每个柱子右边柱子最大高度maxRight[height.length - 1] = height[height.length - 1];for (int i = height.length - 2; i >= 0; i--) {//当前位置,右边的最高高度是前一个位置的右边最高高度和本高度的最大值maxRight[i] = Math.max(height[i], maxRight[i + 1]);}// 求和int sumWater = 0;for (int i = 0; i < height.length; i++) {// 第一个柱子和最后一个柱子不接雨水if (i==0 || i== height.length - 1) {continue;}int h = Math.min(maxLeft[i], maxRight[i]) - height[i];if (h > 0) {sumWater += h;}}return sumWater;}
}

单调栈

单调栈是按照行方向来计算雨水。
栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。
遇到相同高度的柱子:要求宽度的时候 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度。
在这里插入图片描述

import java.util.Stack;public class Solution {public int trap(int[] height){int sumWater = 0;if (height.length <= 2) {return 0;}Stack<Integer> stack = new Stack<>();stack.push(0);for (int index = 1; index < height.length; index++){//情况一if (height[index] < height[stack.peek()]){stack.push(index);}//情况二else if (height[index] == height[stack.peek()]){// 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前的indexstack.pop();stack.push(index);}//情况三else{while (!stack.isEmpty() && (height[index] > height[stack.peek()])){int mid = stack.peek();stack.pop();if (!stack.isEmpty()){int left = stack.peek();//长就是通过柱子的高度来计算int h = Math.min(height[left], height[index]) - height[mid];//宽是通过柱子之间的下标来计算int w = index - left - 1;int area = h * w;if (area > 0) {sumWater += area;}}}stack.push(index);}}return sumWater;}
}

相关文章:

【力扣】42. 接雨水 <模拟、双指针、单调栈>

【力扣】42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 目录 【力扣】42. 接雨水题解暴力双指针单调栈 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…...

【leetcode 力扣刷题】链表基础知识 基础操作

链表基础知识 基础操作 链表基础操作链表基础知识插入节点删除节点查找节点 707. 设计链表实现&#xff1a;单向链表&#xff1a;实现&#xff1a;双向链表 链表基础操作 链表基础知识 在数据结构的学习过程中&#xff0c;我们知道线性表【一种数据组织、在内存中存储的形式】…...

关于openfeign调用时content-type的问题

问题1描述&#xff1a; 今天在A服务使用openfeign调用B服务的时候&#xff0c;发现经常会偶发性报错。错误如下&#xff1a; 情况为偶发&#xff0c;很让人头疼。 两个接口如下&#xff1a; A服务接口&#xff1a; delayReasonApi.test(student);就是使用openfeign调用B服务的…...

OpenCV 玩转图像和视频

为什么学OpenCV&#xff1f; • OpenCV ⽀持对图像缩放、旋转、绘制⽂字图形等基础操作 • OpenCV 库包含了很多计算机视觉领域常⻅算法&#xff1a;⽬标检测、⽬标跟踪等 OpenCV 简介 • OpenCV (Open Source Computer Vision) 是计算机视觉和机器学习软件库 • Intel 1999…...

技术分享 | 如何编写同时兼容 Vue2 和 Vue3 的代码?

LigaAI 的评论编辑器、附件展示以及富文本编辑器都支持在 Vue2&#xff08;Web&#xff09;与 Vue3&#xff08;VSCode、lDEA&#xff09;中使用。这样不仅可以在不同 Vue 版本的工程中间共享代码&#xff0c;还能为后续升级 Vue3 减少一定阻碍。 那么&#xff0c;同时兼容 Vue…...

基于ArcGis提取道路中心线

基于ArcGis提取道路中心线 文章目录 基于ArcGis提取道路中心线前言一、生成缓冲区二、导出栅格数据三、导入栅格数据四、新建中心线要素五、生成中心线总结 前言 最近遇到一个问题&#xff0c;根据道路SHP数据生成模型的时候由于下载的道路数据杂项数据很多&#xff0c;所以导…...

xcode14.3更新一系列问题

1. Missing file libarclite_iphoneos.a (Xcode 14.3) 解决方法 Xcode升级到14.3后编译失败&#xff0c;完整错误日志&#xff1a; File not found: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneo…...

1U和2U的服务器怎么选择

企业建设网站的过程中&#xff0c;离不开租用服务器的环节&#xff0c;服务器在多种场景里面都可以发挥作用&#xff0c;服务器租用渠道有哪些&#xff1f;1U、2U选哪种服务器比较好&#xff1f;大家跟着壹基比小鑫一起来了解具体内容吧&#xff01; 1U、2U选哪种服务器比较好&…...

【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码)

【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码) 一、APPS PBL(Application Primary Boot Loader):固化在CPU ROM中1.1 APPS PBL 加载 XBL Loader1.2 XBL Loader加载验证并运行SMSS进行自检,自检完成后触发Warm Reset1.3 WarmRest后,APPS…...

【数据结构与算法】迪杰斯特拉算法

迪杰斯特拉算法 介绍 迪杰斯特拉&#xff08;Dijkstra&#xff09;算法是典型最短路径算法&#xff0c;用于计算一个节点到其他节点的最短路径。它的主要特点是以中心向外层层扩展&#xff08;广度优先搜索思想&#xff09;&#xff0c;直到扩展到终点为止。 算法过程 设置…...

python爬虫-网页数据提取

import requests #headers 网页右键->Network->最下面的User-Agent复制。 headers {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"} #你想要的网址 url &q…...

ZigBee的Many-to-One和Source Routing

1. Many-to-One Routing Many-to-One Routing&#xff0c;是一种简单的路由机制&#xff0c;使得整个网络中的路由设备拥有回到中心节点的路由。 在这种机制下&#xff0c;中心节点周期性发送Many-to-One route discovery广播&#xff08;协议栈默认设置为60s&#xff0c;可以…...

七夕节 Chinese Valentine‘s Day 的由来

农历七月初七是七夕节。Qixi Festival falls on the seventh day of the seventh lunar month. 以前有一个牛郎&#xff0c;和他的哥哥和嫂子住在一起。他放的一头牛曾经是天庭的一个神仙&#xff0c;但他违反天庭的戒律&#xff0c;变成牛放到了人间。As the story goes,once …...

掌握JDK21全新结构化并发编程,轻松提升开发效率!

1 概要 通过引入结构化并发编程的API&#xff0c;简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元&#xff0c;从而简化错误处理和取消操作&#xff0c;提高可靠性&#xff0c;并增强可观察性。这是一个预览版的API。 2 历史 结构化并发是由JEP 42…...

【SA8295P 源码分析】00 - 系列文章链接汇总 - 持续更新中

【SA8295P 源码分析】00 - 系列文章链接汇总 - 持续更新中 一、分区、下载、GPIO等杂项相关二、开机启动流程代码分析二、OpenWFD 显示屏模块三、Touch Panel 触摸屏模块四、QUPv3 及 QNX Host透传配置五、Camera 摄像头模块&#xff08;当前正在更新中...&#xff09;六、网络…...

TCP拥塞控制详解 | 6. 主动队列管理

网络传输问题本质上是对网络资源的共享和复用问题&#xff0c;因此拥塞控制是网络工程领域的核心问题之一&#xff0c;并且随着互联网和数据中心流量的爆炸式增长&#xff0c;相关算法和机制出现了很多创新&#xff0c;本系列是免费电子书《TCP Congestion Control: A Systems …...

前端学习清单

顺序不分先后。 技术名称技术描述技术链接HTML5HTML5是下一代的HTML标准&#xff0c;是一种用于结构化内容的标记语言。MDN|HTMLCSS3CSS3是CSS技术的升级版本&#xff0c;它的最大好处就是可以让网页设计师更加方便的为网页添加各种各样的样式&#xff0c;而不用再局限于文字、…...

go atomic原子操作详细解读

文章目录 概要1、基本知识1.1 原子操作是什么1.2 CPU怎么实现原子操作的&#xff1f; 2、atomic包2.1、 Add函数2.2、CompareAndSwap函数2.3、Swap函数2.4、Load函数2.5、Store函数 3、atomic.Value值 概要 atomic包是golang通过对底层系统支持的原子操作进行封装&#xff0c;…...

Vue用JSEncrypt对长文本json加密以及发现解密失败

哈喽 大家好啊&#xff0c;最近发现进行加密后 超长文本后端解密失败&#xff0c;经过看其他博主修改 JSEncrypt原生代码如下&#xff1a; // 分段加密&#xff0c;支持中文JSEncrypt.prototype.encryptUnicodeLong function (string) {var k this.getKey();//根据key所能编…...

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的&#xff1a; 左右两侧都留了大块空白&#xff0c;很难看 解决方案 点击横坐标&#xff0c;双击&#xff0c;然后按下图顺序点击 效果...

华为OD机试双机位C卷-最佳植树距离(C/C++/Py/Java/Js/Go)

最佳植树距离 华为OD机试真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 华为OD上机考试2026双机位C卷 华为OD机试双机位C卷 200分题型 题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带…...

如何选择跨框架AI工具:Unified AI Framework与深度学习编译器的终极指南

如何选择跨框架AI工具&#xff1a;Unified AI Framework与深度学习编译器的终极指南 【免费下载链接】ivy The Unified AI Framework 项目地址: https://gitcode.com/gh_mirrors/ivy/ivy 在人工智能开发中&#xff0c;跨框架兼容性一直是开发者面临的主要挑战。无论是研…...

Kimi-VL-A3B-Thinking开源大模型价值:相比闭源方案降本70%+数据本地化保障

Kimi-VL-A3B-Thinking开源大模型价值&#xff1a;相比闭源方案降本70%数据本地化保障 1. 模型简介与核心优势 Kimi-VL-A3B-Thinking是一款创新的开源混合专家&#xff08;MoE&#xff09;视觉语言模型&#xff0c;在多模态推理领域展现出卓越性能。该模型仅激活2.8B参数的语言…...

#第七届立创电赛# 基于N32G430C8L7与INA199的USB功率计设计与实现

手把手教你做一个USB功率计&#xff1a;基于N32G430C8L7与INA199 最近在捣鼓一些USB设备&#xff0c;总想知道它们到底吃了多少电&#xff0c;是5V 1A还是能触发快充&#xff1f;市面上现成的USB功率计要么太贵&#xff0c;要么功能单一。正好&#xff0c;借着立创电赛的机会&a…...

阿里云容器镜像服务避坑指南:Docker推送失败的5个常见原因及解决方法

阿里云容器镜像服务深度排障手册&#xff1a;从Docker推送失败到高效运维 当你第17次在深夜尝试将Docker镜像推送到阿里云仓库却看到红色的错误提示时&#xff0c;那种挫败感我深有体会。作为每天处理数百次镜像推送的DevOps工程师&#xff0c;我整理了一份你在任何官方文档都找…...

MATLAB新手必看:5分钟搞定OBJ文件导入与3D模型可视化

MATLAB新手必看&#xff1a;5分钟搞定OBJ文件导入与3D模型可视化 当你第一次接触3D模型处理时&#xff0c;OBJ文件格式可能是最常遇到的挑战之一。作为MATLAB初学者&#xff0c;你可能已经发现这个强大的计算平台不仅能处理数值运算&#xff0c;还能成为3D可视化的得力助手。本…...

【架构】----Java 架构师实战:从 0 到 1 构建企业级项目亮点体系(2),你了解多少??

下面这些都是真实项目里常用、面试官爱问、能体现架构能力的亮点&#xff0c;涵盖&#xff1a; • 中间件 • 云原生 • 大数据 • 安全 • 运维 • 业务架构 • 第三方解决方案 • 性能优化 • 稳定性建设 我会继续按大类扩展&#xff0c;保证你能挑到足够多的亮点。一、文件/…...

造相-Z-Image-Turbo 解决403 Forbidden:模型API访问权限与安全配置

造相-Z-Image-Turbo 解决403 Forbidden&#xff1a;模型API访问权限与安全配置 遇到“403 Forbidden”这个错误&#xff0c;就像你走到一扇门前&#xff0c;明明知道里面有你要的东西&#xff0c;但门卫就是不让你进&#xff0c;挺让人头疼的。特别是当你刚部署好造相-Z-Image…...

腾讯混元音效生成器体验:HunyuanVideo-Foley让视频制作效率翻倍

腾讯混元音效生成器体验&#xff1a;HunyuanVideo-Foley让视频制作效率翻倍 1. 引言&#xff1a;视频音效的痛点与解决方案 作为一名视频创作者&#xff0c;你是否经常遇到这样的困扰&#xff1a; 精心剪辑的画面因为缺乏合适的音效而显得单调花费大量时间在音效素材库中寻找…...

Halcon图像处理避坑指南:轮廓转区域时Mode参数的正确选择与常见错误

Halcon图像处理避坑指南&#xff1a;轮廓转区域时Mode参数的正确选择与常见错误 在工业视觉检测项目中&#xff0c;轮廓到区域的转换是图像预处理的关键环节。许多开发者在使用gen_region_contour_xld算子时&#xff0c;往往低估了Mode参数的选择对后续处理的影响。我曾在一个P…...