leetcode42. 接雨水(单调栈-java)

news2025/1/16 13:50:48

接雨水

  • leetcode42. 接雨水
    • 题目描述
    • 单调栈解题
    • 代码演示
  • 单调栈专题

leetcode42. 接雨水

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/trapping-rain-water

题目描述

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

示例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 * 10000
0 <= height[i] <= 10000

单调栈解题

单调栈其实就是在栈的基础上,维持一个栈内元素单调。
在这道题,由于需要找某个位置两侧比其高的柱子(只有两侧有比当前位置高的柱子,当前位置才能接下雨水),我们可以维持栈内元素的单调递减。
找某侧最近一个比其大的值,使用单调栈维持栈内元素递减;找某侧最近一个比其小的值,使用单调栈维持栈内元素递增 …
当某个位置的元素弹出栈时,例如位置 a ,我们自然可以得到 a 位置两侧比 a 高的柱子:

一个是导致 a 位置元素弹出的柱子( a 右侧比 a 高的柱子)
一个是 a 弹栈后的栈顶元素(a 左侧比 a 高的柱子)

当有了 a 左右两侧比 a 高的柱子后,便可计算 a 位置可接下的雨水量。

我们可以用数组来优化栈结构,这样常数时间效率更高.

代码演示

  /**
     * 接雨水
     * @param height
     * @return
     */
    public int trap(int[] height) {
        if (height == null || height.length < 3){
            return 0;
        }
        int N = height.length;
        int[]stack = new int[N];
        int stackSize = 0;
        int ans = 0;
        for (int i = 0; i < N;i++){
            while (stackSize != 0 && height[i] > height[stack[stackSize - 1]]){
                int cur = stack[--stackSize];
                //stackSize == 0 说明左边没有值,无法接雨水,直接结束当前循环
                if (stackSize == 0){
                    break;
                }
                //左边柱子在的位置
                int l = stack[stackSize - 1];
                //宽度
                int w = i - l - 1;
                //高度
                int h = Math.min(height[l],height[i] ) - height[cur];
                ans += (w * h);
            }
            stack[stackSize++] = i;
        }

        return ans;
    }

单调栈专题

leetcode1856. 子数组最小乘积的最大值

leetcode84. 柱状图中最大的矩形

leetcode.85. 最大矩形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一章让你明白什么是权限

目录 &#x1f30f;什么是Linux 权限&#xff1f; &#x1f30f;文件&#xff1a; &#x1f30f;目录&#xff1a; &#x1f30f;查看文件的权限 &#x1f30f;权限针对的三类用户&#xff1a; &#x1f30f;ls -l 命令显示的意义 &#x1f30f;修改文件的属性和权限 …

uni-app获取系统信息(手机牌子、手机型号、屏幕宽度、屏幕高度)

uni.getSystemInfo({success(res) {console.log(res.brand) //手机牌子console.log(res.model) //手机型号console.log(res.screenWidth) //屏幕宽度console.log(res.screenHeight) //屏幕高度}) .exec()}}); 如下 官网链接&#xff1a;系统信息的概念 | uni-app官网

基于Java学生作业管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

机器学习面试题 - 模型评估1

目录标题 1、准确率的局限性广告投放问题&#xff1a; 2、精确率与召回率的权衡2.1 案例2.2 P-R曲线 3、平方根误差4、ROC曲线5、如何绘制ROC6、如何计算AUC7、ROC曲线相比P-R曲线有什么特点&#xff1f; 模型评估主要分为离线评估和在线评估两个阶段。 针对分类、排序、回归、…

uni_app 微信小程序 苹果手机 边框显示不全

![在这里插入图片描述](https://img-blog.csdnimg.cn/3a4c4ab1a146444c84c72d360a057c01.png 解决方案&#xff1a; 原因&#xff1a;是因为我们在设置边框的时候设置的rpx &#xff0c;自适应会自动换算px, 两者之间的比例一般都是1.5-2之间&#xff0c;对于边框 border 来说…

指定专业和城市|超声科医生赴美国佐治亚理工学院自费访学

从事超声医学的Y医生拟自费赴美国访学&#xff0c;希望在亚特兰大附近&#xff0c;且专业相符。最终我们落实了佐治亚理工学院的职位&#xff0c;专业及地理位置都符合申请人的预期目标。 Y医生背景&#xff1a; 申请类型&#xff1a;自费访学 工作背景&#xff1a;三甲医院医…

QT 实现windows系统文件拖拽

效果预览&#xff1a; 2023-07-05 14-29-11 功能描述&#xff1a; 1.首先实现了根据文件的路径获取了文件的信息&#xff0c;通过 QFileIconProvider 获取图标信息&#xff0c;并在界面上进行展示。 2.dropEvent 是实现拖拽功能的核心。重新此事件函数&#xff0c;并将窗口设…

vue实现动态URL

最近在项目上要用到动态baseURL,用的是vuex存储&#xff0c;具体实现如下 1.拦截器中重写baseURL 但是需要注意的是这个url必须符合URL格式&#xff0c;所以前端校验是必须的 2.前端校验 const validateUrl (rule, value, callback) > {if (isBlank(value)) {callback(ne…

【技巧】快速提取PowerPoint文件的图片

如果你看到PPT里的图片或背景素材比较好看&#xff0c;想要保存下来&#xff0c;你会怎么做呢&#xff1f; 可能很多人首先想到的就是选择图片后另存下来&#xff0c;或者使用截图保存&#xff0c;这也是一种方法&#xff0c;但如果图片很多的话&#xff0c;就十分繁琐和费时间…

MySQL用户与权限管理

用户与权限管理 1. 用户管理1.1 创建用户1.2 修改用户1.3 删除用户1.4 用户密码相关1.4.1 密码修改1.4.2 密码管理机制 2. 权限管理2.1 授予权限原则2.2 查看权限2.3 授予权限2.4 收回权限 3. 权限表4. 访问控制 1. 用户管理 MySQL用户分为root用户和普通用户&#xff1b;root…

大模型时代的模型运维与部署:LLMops

文章目录 1 LLMOps介绍1.1 关联定义1.2 LLMOps 与 MLOps 2 LLMOps实现步骤2.1 数据管理2.1.1 数据清洗和预处理技术2.1.2 数据标记和注释2.1.3 数据存储、组织和版本控制2.1.4 数据合规性检验 2.2 基础模型的选择2.3 迭代和提示管理2.4 测试评估2.5 部署2.6 监控 3 参考文献 1 …

万物的算法日记|算法学习 [java 二分法 acwing789.数的范围]

算法语言&#xff1a;java 题目来源&#xff1a;acwing.789 文章目录 题目描述题解五点七边的二分法第一个细节 l&#xff0c;r 边界问题为什么 l 边界初始化为 -1&#xff1f;同理为什么 r 边界初始化为 N而不是N-1 ?第二个细节 m是否始终处于[0,N)以内第三个细节&#xff0c…

【UnityDOTS 四】System的理解

System的理解 前言 System主要用于在ECS中进行逻辑处理。它具有自己的声明周期&#xff0c;主要分为两类&#xff1a;ISystem,SystemBase。前一个是非托管内存访问&#xff0c;后一个是托管内存访问。 一、Systemg认知 System在主线程运行&#xff0c;可以在代码中使用Job系…

基于php电影动漫在线观看系统 (源码➕数据库)

本系统主要是为用户提供一个动漫视频观看的平台&#xff0c;系统分为两个角色&#xff0c;一个是用户角色&#xff0c;另一个是管理员角色&#xff0c;其中用户角色可查看动漫视频的分类&#xff0c;查看动漫视频的详情&#xff0c;点击播放动漫视频&#xff0c;对动漫视频进行…

如何使用 OpenCV 去除图像背景

文末附源代码的免费下载链接 在本教程中,我们将学习如何使用 OpenCV 使用一种名为背景减法的技术来去除视频中的背景。 背景扣除是计算机视觉中用于检测视频中移动物体的常用技术。对于安全、监视、交通监控等来说,这是一种非常有用的技术。 背景减法的基本思想是通过从前景…

VirtualBox安装Ubuntu(22.04.2)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【Hello mysql】 数据库基础

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;简单的介绍mysql相关的一些基础知识和在Linux环境下的安装 让大家对于mysql有一个初步的认知 数据库基础 数据库基础数据库定义数据库再理解软件角度文件角度总结 主流数据库mysql安装卸载不要的环境获取mysql官方yum源安装…

MySQL数据库引擎及账号管理

目录 前言 二、MySQL数据库引擎 1.是什么 2.MySQL的核心 3.MySQL的存储引擎 a.InnoDB(MySQL默认引擎) b.ACID事务 c.四种隔离级别 d.MyISAM e.MEMORY&#xff08;Heap&#xff09; 4.存储引擎查看 三、命令行操作数据库 四、账号管理 前言 MySQL安装请看MySQL的安装…

输入框input事件compositionstart和compositionend的妙用

现象&#xff1a; 在将输入输入法切换到中文的时候&#xff0c;在打拼音的过程中也会触发oninput事件&#xff0c;如下&#xff1a; const Demo()>{const [value,setValue]useState("");return (<><input onInput{(e)>{console.log("value&…

【多种优化算法比较】混沌引力搜索算法(CGSA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…