LeetCode-42. 接雨水(单调栈和双指针)

原题链接

前言

记录一下接雨水这道题的我的思路过程,方便之后复习。

正文

题目很简单,

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

双指针做法

首先介绍一下双指针的做法

初始状态,左指针指向数组第一个位置,右指针指向数组的最后一个位置,

同时利用一个变量pre储存左边界到左指针这一范围的最大值,一个变量re储存右边界到右指针这一范围的最大值,当当前pre值大于re值时,说明当前的右指针指向的位置如果小于变量re的值,那么它一定可以储存水,并且最大高度为re的值,与此同时就可以将这个位置的水的量加入答案之中,同时由于当前位置的值已经使用过,左移右指针

反之同理,如果当前re值小于pre值,说明当前左指针所指向位置的值若小于pre的值,那么这个位置一定可以储存水,并且储存水的最大绝对高度为pre,相对高度则为pre-当前左指针所指向位置的高度。

代码实现如下:

class Solution {
public:
    int trap(vector<int>& height) {
        int len = height.size();
        int i = 0, j = len - 1;
        int premax = 0, remax = 0;
        int ans = 0;
        while (i <= j) {
            premax = max(premax, height[i]);
            remax = max(remax, height[j]);
            if (premax >= remax)
                ans += remax - height[j--];//可以储存的水的量
            else
                ans += premax - height[i++];
        }
        return ans;
    }
};

栈做法

接下来介绍如何用单调栈来做这道题。

上面双指针的做法形象一点是一列一列地将雨水加入答案,而栈的做法则是一行一行的将储存的雨水加入答案:

首先,我们需要一个空的栈,然后从左到右依次将数组中的值加入栈中,

如果当前需要加入的值小于栈顶元素,那么继续加入即可,因为还没有遇到“桶”的右挡板,无法储存雨水,

而当前需要加入的值大于栈顶元素的时候,我们也不能心急,因为我们还需要判断桶的左挡板是否存在,这时候如何得到呢?先将当前栈顶元素top储存起来,然后弹出栈顶,随后的栈顶元素就是我们需要的左挡板,因为栈当中的元素是按从大到小排列的(接下来会说),此时如果栈为空,那么说明没有左挡板,如果栈中有数值,那么它一定比我们之前储存起来的栈top变量要大,此时,则说明我们top这个位置可以储存雨水,那么继续,我们可以通过当前遍历到的元素的下标减去当前栈顶(左挡板)的下标 - 1就可以得到我们的桶的宽度了,如何得到下标?很简单将下标存入栈就行了!

高则是通过min(左挡板的高度,右挡板的高度) - 桶底的高度(也就是储存起来的变量top)得到

此时就可以将(宽*高)加入我们的答案了,

此时还不能将遍历的指针后移!因为我们还不知道左侧是否还存在一个更高的挡板,之前我们也说了,我们使用栈是一行一行的将储存的雨水加入答案,因此我们需要将栈中的元素遍历,一直到栈顶元素大于当前遍历到数组元素的值,此时就算我们的这一个小“桶”加入完雨水了。

下面是代码的实现:

class Solution {
public:
    int trap(vector<int>& height) {
        int len = height.size();
        int ans = 0;
        stack<int> st;
        for (int i = 0; i < len; i++) {
            while (!st.empty() && height[st.top()] < height[i]) {
                int top = st.top();
                st.pop();
                if (st.empty())
                    break;
                int left = st.top();
                int width = i - left - 1;
                int hei = min(height[left], height[i]) - height[top];
                ans += hei * width;
            }
            st.push(i);
        }
        return ans;
    }
};

结语

这两种做法并非自己想出来的,而是通过看0x3f的视频学会的,然后通过自己的理解写出来的blog

目的是为了巩固自己的知识,希望也能帮助到你吧~

-------END-------

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV学习——图像融合

import cv2 as cv import cv2 as cvbg cv.imread("test_images/background.jpg", cv.IMREAD_COLOR) fg cv.imread("test_images/forground.png", cv.IMREAD_COLOR)# 打印图片尺寸 print(bg.shape) print(fg.shape)resize_size (1200, 800)bg cv.resize…

ChatGPT重大更新:新增实时搜索和高级语音

12月17日消息&#xff0c;据报道&#xff0c;OpenAI开启了第八天技术分享直播&#xff0c;对ChatGPT搜索功能进行了大量更新。 此次ChatGPT新增的功能亮点纷呈。其中&#xff0c;实时搜索功能尤为引人注目。OpenAI对搜索算法进行了深度优化&#xff0c;使得用户提出问题后&…

30. Three.js案例-绘制并渲染圆弧

30. Three.js案例-绘制并渲染圆弧 实现效果 知识点 WebGLRenderer WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它利用 WebGL 技术在浏览器中渲染 3D 图形。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&#xff…

YOLO8 改进 009:引入 ASFF 对 YOLOv8 检测头进行优化(适用于小目标检测任务)

论文题目&#xff1a;Learning Spatial Fusion for Single-Shot Object Detection 论文地址&#xff1a;Paper - ASFF 官方源码&#xff1a;GitHub - GOATmessi8/ASFF 简 介 多尺度特征融合是解决多尺度目标检测问题的关键技术&#xff0c;其中 FPN&#xff08;特征金字塔网络…

【数据集】生菜病害检测数据集530张6类YOLO+VOC格式

数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;530 Annotations文件夹中xml文件总计&#xff1a;530 labels文件夹中txt文件总计&#xff1a;530 标签种类数&#…

设计模式2

23中设计模式分类 创建型模式&#xff1a;对象实例化的模式&#xff0c;创建型模式用于解耦对象的实例化过程。&#xff08;对象的创建和对象的使用分离&#xff09; 5种&#xff1a;单例模式、工厂模式、抽象工厂模式、原型模式、建造者模式 结构型模式&#xff1a;把类或对…

CSS边框的样式

边框阴影 让元素更有立体感 img {box-shadow: 2px 10px 5px 20px #ff0000;border-radius: 44px;}语法&#xff1a;box-shadow&#xff1a;值1 值2 值3 值4 值5 值1&#xff1a;水平阴影的位置值2&#xff1a;垂直阴影的位置值3&#xff1a;模糊距离值4&#xff1a;阴影的尺寸…

Spring篇--xml方式整合第三方框架

Spring xml方式整合第三方框架 xml整合第三方框架有两种整合方案&#xff1a; ​ 不需要自定义名空间&#xff0c;不需要使用Spring的配置文件配置第三方框架本身内容&#xff0c;例如&#xff1a;MyBatis&#xff1b; ​ 需要引入第三方框架命名空间&#xff0c;需要使用…

Javascript-web API-day02

文章目录 01-事件监听02-点击关闭广告03-随机点名案例04-鼠标经过或离开事件05-可点击的轮播图06-小米搜索框07-键盘类型事件08-键盘事件-发布评论案例09-focus选择器10-评论回车发布11-事件对象12-trim方法13-环境对象14-回调函数15-tab栏切换 01-事件监听 <!DOCTYPE html…

powershell(1)

免责声明 学习视频来自 B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;http…

GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法

GraphReader: 将长文本结构化为图&#xff0c;并让 agent 自主探索&#xff0c;结合的大模型长文本处理增强方法 论文大纲理解为什么大模型和知识图谱不够&#xff1f;还要多智能体 设计思路数据分析解法拆解全流程核心模式提问为什么传统的长文本处理方法会随着文本长度增加而…

如何一站式计算抗体和蛋白信息

在生物医药研究领域&#xff0c;蛋白质&#xff08;抗体、多肽等&#xff09;的性质计算是理解生命机制、分离/纯化/鉴定/生产蛋白、以及开发蛋白新药的重要研究手段。然而&#xff0c;很多相关功能分散在不同的软件中&#xff0c;十分不方便。鹰谷电子实验记录本InELN一站式内…

物理信息神经网络(PINN)八课时教案

物理信息神经网络&#xff08;PINN&#xff09;八课时教案 第一课&#xff1a;物理信息神经网络概述 1.1 PINN的定义与背景 物理信息神经网络&#xff08;Physics-Informed Neural Networks&#xff0c;简称PINN&#xff09;是一种将物理定律融入神经网络训练过程中的先进方…

gitlab初始化+API批量操作

几年没接触gitlab了&#xff0c;新版本装完以后代码提交到默认的main分支&#xff0c;master不再是主分支 项目有几十个仓库&#xff0c;研发提交代码后仓库地址和之前的发生了变化 有几个点 需要注意 1、修改全局默认分支 2、关闭分支保护 上面修改了全局配置不会影响已经创…

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…

STM32CUBEMX+STM32H743ZIT6+MPU+DMA+UART下发指令对MPU配置管理

实现stm32H7的IAP过程&#xff0c;没有想象中的顺利。 需要解决串口DMA和MPU配置管理。 查看正点原子的MPU管理例程&#xff0c;想自己用串口下发指令&#xff0c;实现MPU打开&#xff0c;读取和写入指令。 中间遇到很多坑&#xff0c;比如串口DMA方式下发指令&#xff0c;没反…

8. 数组拼接

题目描述 现在有多组整数数组&#xff0c;需要将它们合并成一个新的数组。合并规则&#xff0c;从每个数组里按顺序取出固定长度的内容合并到新的数组中&#xff0c;取完的内容会删除掉&#xff0c;如果该行不足固定长度或者已经为空&#xff0c;则直接取出剩余部分的内容放到新…

Chrome 浏览器原生功能截长屏

我偶尔需要截取一些网页内容作为素材&#xff0c;但偶尔内容很长无法截全&#xff0c;需要多次截屏再拼接&#xff0c;过于麻烦。所以记录下这个通过浏览器原生功能截长屏的方案。 注意 这种方案并不是百分百完美&#xff0c;如果涉及到一些需要滚动加载的数据或者悬浮区块&am…

学技术学英文:代码中的锁:悲观锁和乐观锁

本文导读&#xff1a; 1. 举例说明加锁的场景&#xff1a; 多线程并发情况下有资源竞争的时候&#xff0c;如果不加锁&#xff0c;会出现数据错误&#xff0c;举例说明&#xff1a; 业务需求&#xff1a;账户余额>取款金额&#xff0c;才能取钱。 时间线 两人共有账户 …

深度学习之目标检测——RCNN

Selective Search 背景:事先不知道需要检测哪个类别,且候选目标存在层级关系与尺度关系 常规解决方法&#xff1a;穷举法&#xff0c;在原始图片上进行不同尺度不同大小的滑窗&#xff0c;获取每个可能的位置 弊端&#xff1a;计算量大&#xff0c;且尺度不能兼顾 Selective …