单调栈是一种栈数据结构,只能在栈顶进行插入和删除操作。 单调栈的特点是栈中的元素按照一定的单调性排列,常用的有单调递增和单调递减。 在插入新元素时,如果新元素破坏了当前的单调性,则从栈顶删除一部分元素,直到满足单调性要求。这样可以保证栈中的元素保持单调性。 单调栈的典型应用是在寻找下一个更大/更小元...
单调队列和单调栈都是一种数据结构,应用十分广泛,在蓝桥杯、ICPC、CCPC等著名编程赛事都是重点的算法,今天博主将自己对单调栈与单调队列的理解以及刷题的经验,用一篇博客分享给大家,希望对大家有所帮助,它们用于解决类似“寻找最大值与最小值”这样的问题。它们的区别
单调队列与普通队列有些不同,因为右端既可以插入又可以删除,因此在代码中通常用一份数组和rear与rear两个指针来实现,而不是使用STL中的queue。如果一定要使用STL ,那么则可以使用双端队列(即两端都可以插入和删除),即deque 。 队列的大小问题 在谈及单调栈时,无需关心栈的大小。而对于队列,队列的大小就很重要了...
push(x)将元素x入栈 emplace(x)在栈顶构造元素x,并入栈(可以简单理解push()和emplace()差别不大) pop()无参数,将栈顶元素弹出 size()返回栈的大小(元素个数) empty()返回bool值表示栈是否为空 stk1.swap(stk2)交换两个栈 补充知识 栈在处理一些问题的时候非常好用,比如在做深度优先搜索dfs的时候,需要需...
单调栈是一种数据结构,它里边存放的数据具有单调性,每个元素都只进栈一次,进栈时会把破坏栈的单调性的元素弹出。 为了描述方便,以下举例及伪代码以维护一个整数的单调递增栈为例。 1. 过程 插入 将一个元素插入单调栈时,为了维护栈的单调性,需要在保证将该元素插入到栈顶后整个栈满足单调性的前提下弹出最少的...
POJ 2796 Feel Good 单调栈 最近做这方面的题很多,感觉单调栈很是神奇,通过维护一个单调不减的栈,遇到小于栈顶的栈顶元素便出栈,此时跟新结果。 这个比RMQ的ST算法要快很多,ST算法要枚举每一个区间(没想到其他做法,可能要dp,反正不会)。这个题关键在于给每一个点找一个最长子序列,使其最小值为其本身,这样...
维护一个单调不增的单调栈,根据题目含义画画图,可以发现答案是: 对于当前点,从栈里第一个严格大于当前元素的值开始数,栈里有多少个元素。 暴力思路就是二分。 可以发现你找到的那个元素后面的部分都会被弹掉,所以一边弹一边计数即可。 特殊的一点是权值相同的,这部分不会被弹栈,但是对答案也有贡献。
单调栈模板 栈:先进后出。 队列:先进先出。 数组模拟栈和队列相较于STL的好处在于速度快,虽然在实际编译的时候会有O2优化,使两者相差无几,但是在算法题中一般没有优化。 栈算法模板 // 栈定义为stk[N],tt表示栈顶,初始化为0intstk[N],tt=0;// 向栈顶插入一个数stk[++tt]=x;// 从栈顶弹出一个数...
84. Largest Rectangle in Histogram 借助单调栈实现O(n) 算法,且已尽可能优化。但是测试样例存在bug ,即使使用提交页面提供的0ms代码,在当前测试样例下,至少也有80ms耗时,与本人结果一致,怀疑存在后期加入其他复杂测试样例。89. Gray Code 已做到时间+空间最优解,运算全部位运算,不论golang还是C++都做不到0ms解...
刷题的话,到笔试之前,感觉200左右的题量还是需要的,我牛客和力扣加起来差不多刷了500+左右,基本一些常见的结构和算法(单调栈、前缀和/树、查分数组、二分、动态规划等)都练习过。见识过较多题型,在看到题目才才能快速联想到该用什么样的数据结构和什么样的算法...