单调栈算法心得

LeetCode刷题记录---单调栈专题 When to use 单调栈?:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。 阅读详情

单调栈

具体题目

  1. leetcode 84. 柱状图中最大的矩形
  2. leetcode 42. 接雨水

算法用途

可以在O(N)时间内找到一组数中的每一个数最近的小于它的数。
比如3,5,6,4,1,8
5左边第一个小于它的数是3
6左边第一个小于它的数是5
4左边第一个小于它的数是3
1左边第一个小于它的数没有
8左边第一个小于它的数是1

单调栈算法可以在O(N)时间内求出答案 3,5,3,null,1

算法描述

算法思想

单调栈在遍历过程中不断压入符合单调性的元素,如果有一个元素X能破坏单调栈内的单调性,则从单调栈中弹出若干元素。弹出这些元素后再压入元素X,单调栈内能维持单调性。一般弹出元素的过程就是执行动作的过程。

算法原理

如果j0<j1 并且num[j0]>num[j1],那么对于任意一个后面的数num[i],(i>j1)。小于num[i]的数一定不会是num[j0],(如果num[j1]小于num[i],那么答案可能为num[j1]。j1比j0更接近i。如果num[j1]>num[i],那么num[j0]也一定大于num[i],而我们要找的是第一个小于num[i]的数,所以这种情况下num[j0]一定不是我们寻找的数)

算法步骤

从左向右遍历。遍历过程中维护一个栈,栈记录的是数组的引索。

遍历到第0个数:3。 由于栈空,引索0压栈。 意味着在3左边比3小的数不存在。
遍历到第1个数:5。 由于5比栈顶引索对应的数字3大,引索1压栈。 意味着在5左边比5小的数是3。
遍历到第2个数:6。 由于6比栈顶引索对应的数字5大,引索2压栈。 意味着在6左边比6小的数是5。
遍历到第3个数:4。 由于4比栈顶引索对应的数字6小,引索2出栈; 由于4比栈顶引索对应的数字5小,引索1出栈。 由于4比栈顶引索对应的数字3大, 引索3压栈。意味着在4左边比4小的数是3。而且由于4的存在,比他它的数5和6不会成为后面遍历的数的答案。
……

这样,就找到了每个数左边比这个数小的数是哪个了。由于每个数最多进栈1次,出栈1次。所以遍历整个数组只需要O(n)的时间。

算法感想

该算法动态地判断不会成为结果的数,从而减少检索量。

【TM1640】STM32 TM1640芯片驱动程序 以下为.h文件: #ifndef __TM1640_H__ #define __TM1640_H__ #include "stm32f10x.h" #define ADDR_START1640 0XC0 #define DSP1640_DIS 0 #define DSP1640_ENB 1 /* 控制显示 ... 阅读详情

相关推荐

天池长期赛:二手车价格预测(422方案分享)

本次比赛是一次很好的锻炼数据挖掘能力的入门赛,从EDA-数据清洗-特征工程-模型调参-模型融合,能够完整的学习到大数据的分析和挖掘,值得历练。

weixin_46685991的博客 1万+

cf 92D 单调栈 二分

题目链接 https://codeforces.com/problemset/problem/92/D 题意 给n个数,问每个数后最远的比他小的数跟他的距离减1,不存在为-1 思路 看题钻逆序牛角尖了,仔细分析一下,从后往前看,对于ai和aj,如果i<j但ai>aj,显然ai一点用没有。因为他不可能产生比aj更优的答案。因此从后往前维护一个递减的单调栈,如果当前数字比栈顶小,压栈,答案为-1,否则根据刚刚分析的,它不会令答案更优,直接二分搜它的答案即可,不用压入栈。 教训/收获 单调栈,单调队列

TheSunspot的博客 494

ESP32蓝牙配网实战:微信小程序中的blufi协议实现与优化

本文详细介绍了在微信小程序中实现ESP32蓝牙配网的实战经验,重点解析了blufi协议的应用与优化。内容涵盖从开发环境配置、协议帧格式解析,到小程序端蓝牙通信、数据转换的核心步骤,并提供了配网状态机设计、错误处理及性能调优等进阶方案,旨在帮助开发者高效、稳定地完成物联网设备配网功能开发。

weixin_29159613的博客 455

2019年7月27日训练日记(单调栈、单调队列)

今天太热了,热到不想动,感觉书也没看进去多少,上午补了几道题,下午看明白了单调栈和单调队列。 1.单调栈: 题目:给定n个不同高度的矩形,求最大的联通的矩形的面积。 单调栈的做法就是: 从头开始将矩形入栈,遇到比栈顶矩形高的就入栈,同时计算不同面积的情况取最大值;遇到比栈顶矩形矮的就把栈内元素全部出栈;然后重复这个操作,就可以找到最大值。 2.单调队列: 题目:给定一行数,要在里面找一个子串,求使...

No Pain, No Gain . 185

5-DOF机械臂课程设计(一)之正逆运动学

文章目录基本要求基本概念关节坐标系的建立正运动学求解DH参数表的建立逆运动学求解多解下解的选取源码下载后续 基本要求 ​ 开发上位机程序,要求有良好的界面,能提供关节空间下和笛卡尔坐 标下表示的目标位姿点和中间若干经过点的输入功能,进行轨迹规划, 并控制机械臂沿轨迹运动,最终完成目标抓取的任务。 基本概念 连杆长度 :2个相邻关节轴线之间的距离 连杆扭角 :2个相邻关节轴线之间的角度 连杆偏距 :2个关节坐标系的X轴之间的距离 关节角度 :关节变量 计算时需要加初始角度偏移 关节坐标系的建立 ​ 根据《机

Rosen的博客 5855

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1111

Leetcode每日一题 2104. 子数组范围和 枚举 / 单调栈 一题两做 通俗易懂

📖本篇内容:Leetcode每日一题 2104. 子数组范围和 枚举 / 单调栈 一题两做 📑 文章专栏:leetcode每日一题《打卡日常》 📆 最近更新:2022年3月3日 leetcode每日一题258. 各位相加 一题三做 递归 / 暴力 / 数学 ⭐算法仓库:小付的算法之路——Alascanfu-algorithm.git.io 🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢.

Alascanfu的博客 659

DFX从芯片到系统:可制造性、可测试性与可靠性设计实战指南

DFX(Design for eXcellence)是一套面向产品全生命周期的设计方法论,涵盖可制造性(DFM)、可测试性(DFT)、可靠性(DFR)等维度。其核心原理是将制造、测试、维护等环节的约束前置到设计阶段,从而降低流片与量产风险。在芯片与系统硬件领域,DFX不仅是提升良率与测试效率的关键手段,更是保障车规、工控等严苛场景下长期稳定运行的基础。从芯片物理实现到PCB布局,再到系统级散热与维护设计,DFX的落地需要工具链、流程闸门与跨部门协作的体系化支撑。本文基于实际项目经验,分享DFX从设计决策到工

weixin_32349093的博客 349

小山菌_代码随想录算法训练营第五十一天| 42. 接雨水 、84.柱状图中最大的矩形

坚持打卡第五十一天

xjturmy的博客 302

Altera下载器驱动配置:手把手教程(从零实现)

详解Altera USB-Blaster驱动安装全过程,从设备识别到软件配置一步一图,解决常见连接问题,确保开发下载器正常工作,适合初学者快速上手FPGA下载调试。

weixin_35751194的博客 988

鲁棒优化 (Robust Optimization) 算法详解及案例分析

鲁棒优化是一种用于处理不确定性优化问题的方法。其目标是在不确定性参数的可能取值范围内,找到一个对不确定性具有鲁棒性的解。

闲人编程的博客 4327

2019.08.17【NOIP?提高组】模拟 A 组 总结

题目

Nowed 349

RK3568 OpenHarmony3.2 蓝牙模块AP6275S适配(已更新)

OpenHarmony3.2 Release版默认是适配AP6275s这款蓝牙芯片的,但是打开蓝牙,发现无法扫描到设备、连接设备。目前平台soc为RK3568,根据项目要求,自定义外设。接下来将以解决bug为目的,学习和记录OpenHarmony平台下蓝牙模块的适配流程。RK809 CLK:32.768KHzUART1M1:与蓝牙模块通讯的串口:GPIO4_B6:GPIO4_A5WAKE_GPIO:未定义,硬件拉高1.8V: 未定义,悬空主要是打开串口,/dev/ttyS1,得到文件描述符fd。

Martian_Jonas的博客 2245

算法学习基础笔记

一开始准备蓝桥杯,真的只是上去就做题 难死拉倒 而且一道题看半天也想不出来然后看别人写的答案也看不懂 我就开始上网搜各种经验贴 最主要的小白一定要看算法基础上视频 我这个小白就看了视频之后感觉不算一前那种特别难受了 跟着视频 算法笔记 不要乱做题目,新手没有经验是做不出来的,我就犯了这个大忌 记住对于任何学习来说 心流能达到的状态是根据自己的能力稍微难一点点 C++的输入与输出cin和cout遇到很多数据的时候比较慢 C语言的输入和输出更快 注意这几个输入都会遇到空格停止 C++的string函数 cha

一季南凉的博客 163

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LeetCode 第 295 场周赛

总结 总结就是自己太菜了哇,单调栈要去多练一练,很多时候单调栈可能不是简单维护最值了。第二题主要考察了库函数,第三题就是单调栈的简单运用叭,赛后感觉确实不难,但是不知道为什么会被比赛时的自己蠢哭~呜呜呜 6079. 价格减免 对库函数不太熟叭hh,不过正好学到了。因为没有特判然后就又寄了一发 class Solution { public: long long check(string s) { if (s.empty()) return false; for (au

释然的成长之路 226

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[无聊的]3月[OI学习记录]...水

3.2 今天十分开心的过了分块的4-6,顺便一题2A。 分块4是一个正常的分块算法问题。 分块5是一个区间开方一开始只是以为是一个区间加,后来才发现是根据根号的性质暴力判。 分块6的话十分开心的RE了,主要原因是vector在重复使用的时候没有清空。 后来又Wa了呜呜,原来正序的枚举因为我脑抽硬是逆序了。 顺便水了一道入门题哈哈哈。 ...

Ronaldo7_ZYB的博客 581

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

代碼隨想錄算法訓練營|一刷完結感想,長路漫漫,望你我一起砥礪前行。刷题心得(c++)

目录 心得總結 各個章節簡易回顧 第一章-數組 第二章-鏈表 第三章-雜湊表 數組 Set Map 第四章-字符串 第五章-棧與隊列 Stack Queue 總結 第六章-二叉樹 第七章-回溯 感想 回溯法模板 第八章-貪心 贪心理论基础 貪心很簡單,只是常識嗎 貪心算法有沒有套路 怎麼辨認出貪心算法 第九章-動態規劃 動態規劃五部曲 誤區 動態規劃與貪心算法的差別 靈魂三問 第十章-單調棧 心得總結 完結了,整整六十幾天基本上每天不是在刷

RVLIN的博客 878

Fzu 寒假专题三

思路:由于在一个圈内,所以常见套路是拆圈为直(把东西复制到后面),由于要求出每个人必须在时的最少人需求,所以利用贪心算法,求出每个的最佳下一个区间,先将每个区间由左边区间按由小到大排序,由于题干说几人没有互相包含的,所以对于一个区间内,越后面的一定右端点越远(下一个区间左端点不超过本区间右端点),这个即为最优区间;思路:要使最后消耗的体力最少,可以利用贪心算法,让每次积累起来的果子和都尽可能小(因为如果积累起来大了的话会与下一次的果子进行再次累加,大的会变的更大);

2401_88661004的博客 584

寒假第三讲总结

思路:优先队列,调用成员函数去解决。

2401_86517033的博客 473

LeetCode——503. 下一个更大元素 II

1.暴力 2.单调栈

weixin_44750790的博客 195

【周赛总结】第28场双周赛——不重叠的子数组,邮筒投递

2020/06/13 rank 326 ac 3 引言 感觉最近状态都不是特别好,可能下周会给自己放个假,暂时不比赛。 第一题 简单题目 可以用暴力的方法,也可以采用单调栈的方法作为连续,这里放一下单调栈的方法。 class Solution(object): def finalPrices(self, prices): # 单调栈的方法,需要考虑不修改的情况,这里直接用ans,另外单调栈一般都是存储索引 stack = [] ans = price

遍地跑小鸡的博客 268

20170814

今天做了剩下几道题,单调队列单调栈感觉理解的挺不错了,最起码我一眼就看出来有那么几个题那不是一个题吗,几乎一样,让求最大矩阵,上来就单调栈向左向右求边界,最后求出面积找最大值。写了两遍之后再看见就已经直接复制粘贴原来的题下来改改要输入输出的内容,改一改其他东西,算法主体不变就交上去了。哈哈,居然对了,还两个都对,其实我还是抱着试一试的心态交的。话说这可不是我偷懒,这么两个单调栈的代码也不难,写太多

konghhhhh的博客 154

2022/5/26蓝桥杯刷题记录

记录杂事 好吧,今天的状态是真的好,除了做核酸排了半个小时队伍 刷题成长 蓝桥幼儿园 很明显的并查集,主要是需要能够把并查集给写出来,但是数据量太爆炸了,出不来,估计换成c++可以 锻造兵器法 什么尺取法,其实就是滑动窗口,挺不错的 小明的衣服 学习了一个新的知识点,哈夫曼树,确实很神奇啊 最长公共子序列,好吧,挺简单的,但是不要忘了 百亿富翁,就是一个单调栈,我都无线优化了,数据量太大了,无语了 蓝桥公园 dijkstra和floyd 小明的背包2 完全背包嘛 骰子 期望

qq_56755264的博客 1343

2019年7月27日学习总结

今天学习了单调栈,跟以前学过的单调队列差不多,还是比较简单的,不过虽然简单却也可以解决许多问题,像poj2559找矩形的最大面积,用单调栈就能很轻松的解决,今天一直在补昨天的题解C题看明白题意了,但看别人的题解不知道为什么要那样写,还是得好好的想一想做题时还是容易犯马虎的毛病,读题不仔细,容易遗漏理解题目的关键点,这是非常要命的,得尽快改正,下午看了一下队列,队列的基本知识都会,主要是做题时不知如...

qq_43641693的博客 167

2004-2005 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2004)

https://codeforc.es/gym/101461 5题结束了,可能是只打了3个小时吧。要是E试试Java8去用高精浮点二分,或者坚持读下来发现F是个割点模板题?以后可能远古场还是不打了,要拉2015年以内的。 D - City Game 悬线法求最大非1子矩阵,根据up[i][j]=(g[i][j]==0)?0:up[i-1][j]+1预处理出悬线。然后每一行用单调栈扫。注意...

aoying6521的博客 389

[洛谷P4147]玉蟾宫

题目大意:最大全一子矩阵 题解:单调栈 卡点:果然我还是不会单调栈,长宽写错 C++ Code: #include <cstdio> #define maxn 1010 struct node { int len, h; inline node (int __len = 0, int __h = 0) {len = __len, h = __h;} } ...

weixin_34061555的博客 149
上一篇: clion调试的一个技巧
下一篇: 引索与数量的关系
?-ldl
博客等级 码龄7年 712粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值