算法刷题Day 59 下一个更大元素II+接雨水

Day 59 单调栈

503. 下一个更大元素II

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int len = nums.size();nums.insert(nums.end(), nums.begin(), nums.end());vector<int> descStk, rst(len, -1);for (int i = 0; i < nums.size(); ++i){while (!descStk.empty() && nums[descStk.back()] < nums[i]){int idx = descStk.back() % len;if (rst[idx] == -1){rst[idx] = nums[i];}descStk.pop_back();}descStk.push_back(i);}return rst;}
};

其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums

class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int len = nums.size();vector<int> descStk, rst(len, -1);for (int i = 0; i < len * 2; ++i){int modI = i % len;while (!descStk.empty() && nums[descStk.back()] < nums[modI]){int idx = descStk.back() % len;if (rst[idx] == -1){rst[idx] = nums[modI];}descStk.pop_back();}descStk.push_back(modI);}return rst;}
};

42. 接雨水

三种方法都写了一遍

暴力方法

逐列计算

找到当前位置,左边最高的柱子的索引和右边最高的柱子的索引,两者中相对小的那个,将去当前位置的高度,就是水柱的高度,而宽度是1

超时了

class Solution {
public:int trap(vector<int>& height) {int sum = 0;for (int i = 1; i < height.size() - 1; i++){int leftTaller, rightTaller;leftTaller = rightTaller = height[i];for (int j = i - 1; j >= 0; --j){if (height[j] > leftTaller){leftTaller = height[j];}}for (int j = i + 1; j < height.size(); ++j){if (height[j] > rightTaller){rightTaller = height[j];}}sum += min(leftTaller, rightTaller) - height[i];}return sum;}
};

双指针

提前记录好左边最高的和右边最高的索引

class Solution {
public:int trap(vector<int>& height) {vector<int> maxLeft(height.size()), maxRight(height.size());maxLeft[0] = height[0];for (int i = 1; i < height.size(); ++i){maxLeft[i] = max(height[i], maxLeft[i - 1]);}maxRight.back() = height.back();        for (int i = height.size() - 2; i >= 0; --i){maxRight[i] = max(height[i], maxRight[i + 1]);}int sum = 0; for (int i = 1; i < height.size() - 1; i++){sum += min(maxLeft[i], maxRight[i]) - height[i];}return sum;}
};

暴力方法和双指针都是按照列的方式进行计算的

单调栈

而单调栈的方式是按照行的方式进行计算的,在思考的时候要记得这一点区别

class Solution {
public:int trap(vector<int>& height) {int sum = 0;stack<int> stk;stk.push(0);for (int i = 0; i < height.size(); ++i){if (height[i] < height[stk.top()]){stk.push(i);}else if (height[i] == height[stk.top()]){stk.pop();stk.push(i);}else{while (!stk.empty() && height[i] > height[stk.top()]){int idx = stk.top();stk.pop();if (!stk.empty()){int w = i - stk.top() - 1;int h = min(height[i], height[stk.top()]) - height[idx];sum += w * h;}}stk.push(i);}}return sum;}
};

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

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

相关文章

自己实现Linux 的 cp指令

cp指令 Linux的cp指令就是复制文件&#xff1a; cp: 拷贝(cp 拷贝的文件 要拷贝到的地址或文件)&#xff0c;cp b.c test.c 将b.c拷成test.c的一个新文件 Linux 系统初识_mjmmm的博客-CSDN博客 实现思路 打开源文件读文件内容到缓冲区创建新文件将读到的文件内容全部写入新文…

Apache+Tomcat 整合

目录 方式一&#xff1a;JK 1、下载安装包 2、添加依赖 3、启动服务&#xff0c;检查端口是否监听 4、提供apxs命令 5、检查是否确实依赖 6、编译安装 7、重要配置文件 方式二&#xff1a;http_proxy 方式三&#xff1a;ajp_proxy 方式一&#xff1a;JK 1、下载安装…

windows环境下如何更改pip安装的默认位置

1.查看配置信息 python -m site2.查看配置文件位置 python -m site -help3.修改配置文件 USER_SITE "D:\\soft\\Anaconda\\Lib\\site-packages" USER_BASE "D:\\soft\\Anaconda\\Scripts"如果遇到文件无法保存情况&#xff0c;请给用户增加权限。 4.…

flask----内置信号的使用/django的信号/ flask-script/sqlalchemy介绍和快速使用/sqlalchemy介绍和快速使用

信号 内置信号的使用 # 第一步&#xff1a;写一个函数 def test(app, **kwargs):print(app)print(type(kwargs))# 请求地址是根路径&#xff0c;才记录日志&#xff0c;其它都不记录print(kwargs[context][request].path)if kwargs[context][request].path /:print(记录日志…

微信如何多号定时群发?

微信作为国内最大的网络社交平台&#xff0c;目前用户已超过11亿。 掐点给朋友送生日祝福,给领导同事送新年祝福&#xff0c;提醒朋友的待办事项等等&#xff0c;这些定时发送功能一直都是微博 QQ&#xff0c;邮箱的专属&#xff0c;如果微信也能定时发送该多好&#xff1f;其…

借用和引用

文章目录 所有权引用和借用可变引用悬垂引用 所有权 Rust通过所有权来管理内存&#xff0c;最妙的是&#xff0c;这种检查只发生在编译期&#xff0c;因此对于程序运行期&#xff0c;不会有任何性能上的损失。 使用堆和栈的性能区别&#xff1a; 写入方面&#xff1a;入栈比在…

Qt实现可伸缩的侧边工具栏(鼠标悬浮控制伸缩栏)

Qt实现可伸缩的侧边工具栏 一直在网上找&#xff0c;发现大多的实现方案都是用一个按钮&#xff0c;按下控制侧边栏的伸缩&#xff0c;但是我想要实现鼠标悬浮在侧边栏的时候就伸出&#xff0c;移开就收缩的功能&#xff0c;也没找到好的参考&#xff0c;所以决定自己实现一个…

人工智能的未来:探索下一代生成模型

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 生成式 AI 目前能够做什么&#xff0c;以及探索下一波生成式 AI 模型需要克服的当前挑战&#xff1f; 如果你跟上科技世界的步伐&#xff0c;你就会知道生成式人工智能是最热门的话题。我们听到了很多关于…

Kafka-消费者组消费流程

消费者向kafka集群发送消费请求&#xff0c;消费者客户端默认每次从kafka集群拉取50M数据&#xff0c;放到缓冲队列中&#xff0c;消费者从缓冲队列中每次拉取500条数据进行消费。

JVM面试突击班2

JVM面试突击班2 对象被判定为不可达对象之后就“死”了吗 对象的生命周期 创建阶段 &#xff08;1&#xff09;为对象分配存储空间 &#xff08;2&#xff09;开始构造对象 &#xff08;3&#xff09;从超类到子类对static成员进行初始化 &#xff08;4&#xff09;超类成…

数学建模学习(10):遗传算法

遗传算法简介 • 遗传算法&#xff08;Genetic Algorithms&#xff09;是基于生物进化理论的原理发展起来的一种广为 应用的、高效的随机搜索与优化的方法。其主要特点是群体搜索策略和群体中个体之 间的信息交换&#xff0c;搜索不依赖于梯度信息。它是20世纪70年代初期由美国…

铸铝齿轮泵比例流量阀放大器

液压齿轮泵是一种常用的液压泵&#xff0c;被广泛应用于各种低压系统中&#xff0c;如采矿、冶金、建筑、航空、航海、农林等机械的中、高压液压系统中。 液压齿轮泵的特点是结构简单&#xff0c;制造方便&#xff0c;价格低廉&#xff0c;体积小&#xff0c;重量轻&#xff0…

机器学习深度学习——循环神经网络RNN

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习—语言模型和数据集 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助…

vs code remote ssh: Resolver error: Error: Got bad result from install script

今天像往常一样&#xff0c;打开 windows 11&#xff0c;使用 vs code 远程连接服务器 ubuntu 20&#xff0c;但是遇到了一个错误&#xff1a;Resolver error: Error: Got bad result from install script。 ok&#xff01;&#xff01;&#xff01;开始 Bing &#xff01;&…

深度解析:外观设计专利与美术作品著作权有何不同

有时候部分产品适合申请一项或多项知产保护&#xff0c;尤其是设计类产品&#xff0c;有的可以同时申请外观设计专利和美术作品著作权&#xff0c;很多人就搞不了解自己究竟该选择哪一项保护。因为外观设计专利和美术著作权这两者看着似乎很相近&#xff0c;又感觉截然不同。那…

利用abapGit的离线模式导出、导入开发对象

1. 背景 abapGit是为ABAP服务器开发的开源Git客户端&#xff0c;用于在ABAP系统之间导入和导出ABAP对象。 使用abapGit&#xff0c;可以将ABAP对象从任何系统导出到另一个系统&#xff0c;通常是从本地系统导出到云&#xff0c;或者从一个云系统导出到另一个云系统。 当然从…

CentOS8安装wireguard-dkms失败

系统信息 [rootVM-4-3-centos ~]# cat /etc/os-release NAME“CentOS Linux” VERSION“8” ID“centos” ID_LIKE“rhel fedora” VERSION_ID“8” PLATFORM_ID“platform:el8” PRETTY_NAME“CentOS Linux 8” ANSI_COLOR“0;31” CPE_NAME“cpe:/o:centos:centos:8” HOME_U…

Redis——特性介绍与应用场景

Redis特性介绍 In-memory data structrues 众所周知&#xff0c;MySQL是一种关系型数据库&#xff0c;其通过表的结构存储数据&#xff0c;就类似于建立了一个excel表格来存储数据。但是像视频这类数据并不适合存储在关系型数据库中&#xff0c;因此存在非关系型数据库——通…

【Linux命令行与Shell脚本编程】第十六章 Shell函数

Linux命令行与Shell脚本编程 第一章 文章目录 Linux命令行与Shell脚本编程六.函数6.1.脚本函数基础6.1.1.创建函数6.1.2.使用函数 6.2.函数返回值6.2.1.默认的退出状态码6.2.2.使用return命令6.2.3.使用函数输出 6.3.函数中使用变量6.3.1.向函数传递参数6.3.2.在函数中处理变量…

python爬虫2:requests库-原理

python爬虫2&#xff1a;requests库-原理 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 目录结构 文章目录 python爬虫2&#xff1a;requests库-原理1. 概述2. re…