单调栈算法笔记

单调栈图文详解(附Java模板) 🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。🐟文章粗浅,希望对大家有帮助!🐠参考文章单调栈详解单调栈 阅读详情

单调栈算法笔记

单调栈

定义: 单调栈就是栈内元素递增或者单调递减的栈,并且只能在栈顶操作。单调栈的维护是O(n)的时间复杂度,所有元素只会进进栈一次

性质

  1. 单调栈里面的元素具有单调性;
  2. 元素加入栈前会把栈顶破坏单调性的元素删除;
  3. 使用单调栈可以找到元素向左遍历的第一个比他小的元素(单增栈),也可以找到元素向左遍历第一个比他大的元素(单减栈);
  4. 一般使用单调栈的题目具有以下的两点:
    • 离自己最近(栈的后进先出的性质)
    • 比自己大(小)、高(低);

注意:虽然称作是递增递减栈,但是实际存储的值并不是单调的,因为可以存坐标,只有坐标带入数组才是单调的。这样既可以存储数组的值,也可以存储数组下标。如下面的2,3,4例题。

例题

1、LeetCode 496. Next Greater Element I

class Solution {
   
   
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
   
   
        vector<int> res(nums1.size(),-1);
        unordered_map<int,int>map;
        stack<int>stk;
        for(int i = 0 ; i < nums2.size(); i++){
   
   
            while(!stk.empty()&& nums2[i] > stk.top()){
   
   
                map[stk.top()] = nums2[i];
                stk.pop();
            }
            stk.push(nums2[i]);

        }
        for(
Java-数据结构-单调栈<一> 一般使用单调栈无非两个方向,单调递减,单调递增。 单调递增栈:存进去的数据都是增加的,碰到减少的时候,这时就要进行操作了 单调递减栈:存进去的数据都是减少的,碰到增加的时候,这时就要进行操作了 对于「找最近一个比当前值大/小」的问题,都可以用单调栈来试试。关键在于,对于栈内存储的元素,什么时候进行取出来操作,是个关键的问题。............ 阅读详情

相关推荐

单调栈-java

本次主要通过数组模拟单调栈来解决问题。

m0_63267251的博客 1628

java 单调栈 详解

java 单调栈 详解

T_Y_F_的博客 1005

单调栈简要分析与实现(Java)

本文对单调栈进行了简要介绍与实现,同时分析了LeetCode中经典的单调栈题目。

ArrebolMKJ的博客 1192

算法课程笔记——单调栈&单调队列

算法课程笔记——单调栈&单调队列。

2302_79123319的博客 601

数据结构与算法学习笔记----单调栈

@ author: 明月清了个风。

weixin_60278491的博客 1058

算法笔记单调栈

2.1.2 没有重复值的数组单调栈的应用方法 没有重复值的数组单调栈的应用方法。 思路: 对于没有重复值的数组来说,应用单调栈的方法能很快找出其左右两侧最近的最小值。 我们准备一个单调递增的栈,依次将元素加入到栈中,在加入一个元素的时候,如果栈顶元素大于当前的元素,就将其出栈,此时右侧的最小值就是让它出栈的值, 左侧的最小值就是此时栈中的栈顶元素。如果此时栈中已经没有元素了,说明没有左侧的最小值。 当所有元素都循环一遍以后,栈中还有值,要将栈中的值依次出栈,此时右侧没有最小值,左侧最小值依然是当前值出栈

u012559967的专栏 710

算法笔记单调栈

1.关于栈:栈准备到时候和队列一起写,这篇博客主要以单调栈为主,我们只要知道栈是什么,如何用数组去模拟栈的进栈和出栈即可。a.什么是栈|     ||     ||     ||     |——以下,就是一个栈,就像是一个桶,每次从栈顶进栈,然后放在低端,也从栈顶出栈,所以说栈是一个先进后出的线性表。b.栈的进栈操作设栈的数组是stack,top是栈内元素,stack[top]是栈顶,进栈元素为k...

Ronaldo7_ZYB的博客 919

单调栈算法笔记java

单调栈 什么的单调栈单调栈就是栈里面存放的数据都是有序的,所以可以分为单调递增栈和单调递减栈两种。 单调递增栈就是从栈底到栈顶是从大到小 单调递减栈就是从栈底到栈顶是从小到大 为什么要使用单调栈? 这个问题应该就是大家的一个共同问题了吧,why?其实很简单就拿LeetCode503. 下一个更大元素 II 这道题来讲,如果利用常规解法,对于每个数而言,我们需要遍历其右边的数,直到找到比自身大的数,这是一个 O(n^2) 的做法。之所以是 O(n^2),是因为每次找下一个最大值,我们是通过遍历来实现的

imbestman的博客 624

算法笔记 单调栈

何为单调栈 栈内元素按照递增(递减)顺序排列的栈 单调递增栈 单调递减栈 单调栈的应用 单增栈应用 线性表下一个更大元素 题目 1019. Next Greater Node In Linked List

星辰不问 172

算法笔记-单调栈

怎么能想到用单调栈呢?什么时候用单调栈呢?通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。例如:要求某个元素A的右边 第一个比他大的元素,该用什么栈?首先栈的特性在于先进后出,当元素A入栈时,他必然是后出的;再者对于右边比这个元素A小的元素,我们一定需要入栈,因为不入栈,右边更小的元素就丢了。从这里其实就可以判断出,后进的元素一定是更小的元素;

bugreturner的博客 998

算法笔记单调栈,单调队列)

从1-6这几个元素照常处理(因为它们满足了单调栈的要求,从栈底到栈顶单调递增),那么1就是栈底,6就是栈顶,当我们处理6后面的2时(下标为6的2),问题来了,这个2如果放入了栈里面,不就不满足单调栈的要求了吗?处理76时,76大于栈顶元素72,那么首先存放72的答案,栈pop,此时栈顶元素为75,76大于75,存放75的答案,然后栈pop,此时栈空,76入栈。处理69时,这里仍然满足单调栈的要求,无需pop,直接入栈,那么此时栈中从底到顶有75,71,69。遍历数组,栈空,73入栈,这里没什么问题。

2301_79606914的博客 1072

算法刷题笔记——单调栈

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。

Petrichorzncu的博客 901

算法笔记单调栈

文章目录1. 单调栈定义2.单调栈用途3.单调栈应用 1. 单调栈定义 从栈顶到栈底的元素是严格递增或递减的栈叫单调栈 2.单调栈用途 可以以 O(1) 的时间复杂度得知某个位置左右两侧比他大(或小)的数的位置和个数 3.单调栈应用 每日温度(来源leetcode) 描述如下: 请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures = [73, 74,

Zrainstar的博客 186

Java数据结构与算法——单调栈算法笔记

文章目录1、单调栈的定义2、单调栈的应用案例一:柱状图中最大的矩形(单调递增栈)案例二:下一个更大元素 I 1、单调栈的定义 栈内元素保持单调,有单调递增栈和单调递减栈。注意:这里的单调递增或递减是指的从栈顶到栈底单调递增或递减。 每个元素都要入栈,且仅入栈一次,出栈后不再入栈。 操作规则(以单调递增栈为例):(1) 如果新元素比栈顶元素大,就入栈;(2) 如果新元素比栈顶元素小,那就一直弹栈,直到栈顶元素小于新元素,这时再将新元素入栈。 注意:栈内可以直接存储元素,也可以存储元素的索引,一般存储的是索引

kezhou的博客 972

算法笔记单调栈

定义:单调栈是一种特殊的数据结构,常用于解决一些和数组有关的问题,比如求解数组中每个元素两侧最近的更大/更小元素等。单调栈的基本思想是:利用栈的"后进先出"特性,维护一个单调递增或单调递减的序列。初始化单调栈的步骤:1. 初始化一个空栈2. 从前往后或从后往前遍历数组3. 每遍历到一个元素,就将其与栈顶元素比较:- 如果满足单调性(如递增栈且新元素大于栈顶),则将新元素入栈。

weixin_53895623的博客 469

算法笔记】重点总结 单调栈/栈

单调栈的使用场景和例题:找下一个更大/更小元素。

一蓑烟雨任平生 635
上一篇: 基础算法模板——二分查找
下一篇: 单调队列算法笔记
Baymax_yan
博客等级 码龄9年 45粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值