leetcode--接雨水(双指针法,动态规划,单调栈)

 

目录

方法一:双指针法

 方法二:动态规划

方法三:单调栈




42. 接雨水 - 力扣(LeetCode)

 

黑色的是柱子,蓝色的是雨水,我们先来观察一下雨水的分布情况:
雨水落在凹槽之间,在一个凹槽的左右都会有两个柱子,两个柱子高度可能相同也可能不同,柱子的高低决定了凹槽的雨水的高度,雨水的高度等于两个柱子较低的高度。

方法一:双指针法

时间复杂度:O(N^2);

空间复杂度:O(1);

缺点:会超时;

思想:统计各个所在位置的左边最高高度和右边最高位置(第一个和最后一个柱子所在位置不用统计,他们不可能会接收雨水),然后算出各个位置雨水面积(两边的最高高度的较小值 - 当前位置的柱子的面积),最后将各个位置的面积相加得到总面积。

 具体实现:

class Solution {
public:int trap(vector<int>& height) {//面积和int sum = 0;for(int i = 0; i < height.size(); i++){//第一个和最后一个不用统计if(i == 0 || i == height.size() - 1)continue;int maxLeft = height[i];int maxRight = height[i];//统计右边for(int j = i + 1; j < height.size(); j++){maxRight = max(maxRight,height[j]);}//统计左边for(int j = i - 1; j >= 0; j--){maxLeft = max(maxLeft,height[j]);}//高度计算int h = min(maxLeft,maxRight) - height[i];if(h > 0)sum += h;}return sum;}
};

 方法二:动态规划

时间复杂度为 O(N);

空间复杂度为 O(N);

思路:在方法一的基础上我们知道,只要知道各个位置的左右最高高度,通过计算就可以求得各个位置的面积,再相加就可以得到总面积。所以就需要遍历数组来找到左右最高高度,方法一使用双指针来求左右最高高度,每走到柱子位置就向左右方向进行统计,实际上是进行了重复计算的,导致时间复杂度为O(N^2)。因为柱子的位置都不会变,对于每个柱子,相对的左右最高高度也是不会变的,所以只需要遍历两次,把每个位置的左右最高高度计算出来放在两个数组中,最后再计算面积就行了。

class Solution {
public:int trap(vector<int>& height) {//动态规划做法//小于等于2个直接返回if(height.size() <= 2)return 0;//左边最高高度--数组初始化为0vector<int> maxLeft(height.size(),0);//右边最高高度--数组初始化为0vector<int> maxRight(height.size(),0);//遍历一次数组记录各个位置的左边最高高度maxLeft[0] = height[0];for(int i = 1; i < maxLeft.size(); i++){maxLeft[i] = max(height[i],maxLeft[i - 1]);}//遍历一次数组记录各个位置的右边最高高度maxRight[maxRight.size() - 1] = height[height.size() - 1];for(int i = maxRight.size() - 2; i >= 0; i--){maxRight[i] = max(height[i],maxRight[i + 1]);}//求和int sum = 0;for(int i = 0; i < height.size(); i++){int count = min(maxLeft[i],maxRight[i]) - height[i];if(count > 0){sum += count;}}return sum;}
};

方法三:单调栈

空间复杂度:O(n);

时间复杂度:O(n);

使用单调栈使站内元素有序,然而单调栈没有现成的容器,所以需要我们自己维持元素有序;

那么栈内有序是(栈底->栈顶) 小->大 还是 大->小呢?答案是大->小;当下一个柱子高度小于栈顶元素时就入栈,就能维持栈内有序,当遇到下一个柱子高度大于栈顶元素时就将栈顶pop掉,再将当前的栈顶元素与下一个柱子的高度比较就可以得到较小值,然后就和上面一样计算面积了。

class Solution {
public:int trap(vector<int>& height) {//如果数组个数两个及以下,直接returnif(height.size() <= 2)return 0;//创建单调栈(栈顶->栈底==小->大),存放下标值stack<int> st;st.push(0);//统计面积int sum = 0;//行方向计算for(int i = 1; i < height.size(); i++){//1.下一个元素小于栈顶元素if(height[i] < height[st.top()]){st.push(i);}//2.下一个元素等于栈顶元素--pop栈顶元素的下标,push下一个元素的下标else if(height[i] == height[st.top()]){st.pop();st.push(i);}//3.下一个元素大于栈顶元素--形成凹槽接收雨水,计算雨水面积else{while(!st.empty() && height[i] > height[st.top()]){//中间的凹槽下标int mid = st.top();st.pop();if(!st.empty()){//高度计算int h = min(height[st.top()],height[i]) - height[mid];//宽度计算int w = i - st.top() - 1;//面积sum += h * w;}}st.push(i);}}return sum;}
};

 

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

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

相关文章

使用js写一个登录验证码效果

面试题 登录页面获取验证码的功能&#xff0c;用户点击获取验证码按钮(id”btn1”)&#xff0c;按文字变为“(N)后获取验证码”&#xff0c;N为倒计对秒数&#xff0c;从 60 开始&#xff0c;每秒减一&#xff0c;减到 0的时候&#xff0c;按钮文字变为“获取验证码”&#xff…

Beans模块之工厂模块Aware

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

【JavaWeb】

Javaweb 数据库相关概念MySQL数据库MySQL数据模型SQLDDL--操作数据库图形化客户端工具DML--操作数据DQL数据库约束 数据库设计多表查询事务 数据库相关概念 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储 英文&#xff1a;DataBase&#xff0c;简称DB 数据库管理系…

Android T 远程动画显示流程其三——桌面侧动画启动到系统侧结束流程

前言 接着前文分析Android T 远程动画显示流程其二 我们通过IRemoteAnimationRunner跨进程通信从系统进程来到了桌面进程&#xff0c;这里是真正动画播放的逻辑。 之后又通过IRemoteAnimationFinishedCallback跨进程通信回到系统进程&#xff0c;处理动画结束时的逻辑。 进入…

使用maven项目引入jQuery

最近在自学 springBoot &#xff0c;期间准备搞一个前后端不分离的东西&#xff0c;于是需要在 maven 中引入jQuery 依赖&#xff0c;网上百度了很多&#xff0c;这里来做一个总结。 1、pom.xml 导入依赖 打开我们项目的 pom.xml 文件&#xff0c;输入以下坐标。这里我使用的是…

FPGA-学会使用vivado中的存储器资源ROM(IP核)

问题&#xff1a; 某芯片,有500个寄存器,需要在上电的时候由FPGA向这些寄存器中写入初始值,初始值已经通过相应的文档给出了具体值,这些值都是已知的。 分析关键点&#xff1a; 数据量比较多&#xff08;Verilog代码&#xff0c;通过case语句、always语句这种查找表的方式,数…

Linux——匿名管道

Linux——匿名管道 什么是管道匿名管道的底层原理观察匿名管道现象读写端的几种情况写端慢&#xff0c;读端快写端快&#xff0c;读端慢 管道的大小写端关闭&#xff0c;读端一直读写端一直写&#xff0c;读端关闭 我们之前一直用的是vim来编写代码&#xff0c;现在有了vscode这…

bert 相似度任务训练,简单版本

目录 任务 代码 train.py predit.py 数据 任务 使用 bert-base-chinese 训练相似度任务&#xff0c;参考&#xff1a;微调BERT模型实现相似性判断 - 知乎 参考他上面代码&#xff0c;他使用的是 BertForNextSentencePrediction 模型&#xff0c;BertForNextSentencePred…

thinkphp学习10-数据库的修改删除

数据修改 使用 update()方法来修改数据&#xff0c;修改成功返回影响行数&#xff0c;没有修改返回 0 public function index(){$data [username > 孙悟空1,];return Db::name(user)->where(id,11)->update($data);}如果修改数据包含了主键信息&#xff0c;比如 i…

STM32标准库开发——BKP备份RTC时钟

备份寄存器BKP(Backup Registers) 由于RTC与BKP关联性较高&#xff0c;所以RTC的时钟校准寄存器以及一些功能都放在了BKP中。TAMPER引脚主要用于防止芯片数据泄露&#xff0c;可以设计一个机关当TAMPER引脚发生电平跳变时自动清除寄存器内数据不同芯片BKP区别&#xff0c;主要体…

c++入门(2)

上期我们说到了部分c修补C语言的不足&#xff0c;今天我们将剩下的一一说清楚。 函数重载 (1).函数重载的形式 C语言不允许函数名相同的同时存在&#xff0c;但是C允许同名函数存在&#xff0c;但是有要求&#xff1a;函数名相同&#xff0c;参数不同&#xff0c;构成函数重…

【数据结构-图论】并查集

并查集&#xff08;Union-Find&#xff09;是一种数据结构&#xff0c;它提供了处理一些不交集的合并及查询问题的高效方法。并查集主要支持两种操作&#xff1a; 查找&#xff08;Find&#xff09;&#xff1a;确定某个元素属于哪个子集&#xff0c;这通常意味着找到该子集的…

人大金仓与mysql的差异与替换

人大金仓中不能使用~下面的符号&#xff0c;字段中使用”&#xff0c;无法识别建表语句 创建表时语句中只定义字段名.字段类型.是否是否为空 Varchar类型改为varchar&#xff08;长度 char&#xff09; Int(0) 类型为int4 定义主键&#xff1a;CONSTRAINT 键名 主键类型&#x…

Found option without preceding group in config file 问题解决

方法就是用记事本打开 然后 左上角点击 文件 有另存为 就可以选择编码格式

Linux设置程序任意位置执行(设置环境变量)

问题 直接编译出来的可执行程序在执行时需要写出完整路径比较麻烦&#xff0c;设置环境变量可以实现在任意位置直接运行。 解决 1.打开.bashrc文件 vim ~/.bashrc 2.修改该文件&#xff08;实现将/home/zhangziheng/file/seqrequester/build/bin&#xff0c;路径下的可执…

第六节:Vben Admin权限-后端控制方式

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、角色权限(后端…

【办公类-18-03】(Python)中班米罗可儿证书批量生成打印(班级、姓名)

作品展示——米罗可儿证书打印幼儿姓名 背景需求 2024年3月1日&#xff0c;中4班孩子一起整理美术操作材料《米罗可儿》的操作本——将每一页纸撕下来&#xff0c;分类摆放、确保纸张上下位置正确。每位孩子们都非常厉害&#xff0c;不仅完成了自己的一本&#xff0c;还将没有…

C++数据结构与算法——二叉搜索树的属性

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Vue2:路由history模式的项目部署后页面刷新404问题处理

一、问题描述 我们把Vue项目的路由模式&#xff0c;设置成history 然后&#xff0c;build 并把dist中的代码部署到nodeexpress服务中 访问页面后&#xff0c;刷新页面报404问题 二、原因分析 server.js文件 会发现&#xff0c;文件中配置的路径没有Vue项目中对应的路径 所以…

Nacos进阶

目录 Nacos支持三种配置加载方案 Namespace方案 DataID方案 Group方案 同时加载多个配置集 Nacos支持三种配置加载方案 Nacos支持“Namespacegroupdata ID”的配置解决方案。 详情见&#xff1a;Nacos config alibaba/spring-cloud-alibaba Wiki GitHub Namespace方案…