单调栈和单调队列的理解

1、单调栈

单调栈是指一个栈内部的元素具有严格单调性的一种数据结构,分为单调递增栈和单调递减栈。

 

其具有以下两个性质:

1,满足栈底到栈顶的元素具有严格单调性。

2,满足栈的先进后出特性,越靠近栈顶的元素越后出栈。

 

元素进栈过程:

对于一个单调递增栈来说,若当前进栈的元素为a,如果a<栈顶元素,则直接将a进栈。

如果a≥栈顶元素,则不断将栈顶元素出栈,直到满足a<栈顶元素。

 

模拟一个数列构造一个单调递增栈

进栈元素分别为3,4,2,6,4,5,2,3。

图片所示过程即为进栈过程。

 

实现单调栈STL栈和手写栈均可。

 

2,单调队列。

单调队列与单调栈及其相似,把单调栈先进后出的性质改为先进先出既可。 

元素进队列的过程对于单调递增队列。

对于一个元素a,如果a>队尾元素,那么直接将a扔进队列,如果a≥队尾元素,则将队尾元素出队列,直到满足 a>队尾元素即可。

 

实现用STL的双端队列即可(我好像一直都是手写的)

由于双端队列即可以在队头操作,也可以在队尾操作,那么这样的性质就弥补了单调栈只能在一边操作的不足。可以使得其左边也有一定的限制。

 

3,时间复杂度分析

对于每个元素,其有且仅有一次插入,最多出现一次删除,故其时间复杂度为O(n)。

 

/*递增栈:(从栈顶到栈底递增)
1.元素入栈之后,其下面元素一定是其左边第一个比它大的数;(可用来求每个元素左边更大的第一个元素)
2.若在元素插入之前,栈顶元素比插入元素小,那么栈顶元素一定是插入元素左边第一个比它小的数
3.若在元素插入之前,栈顶元素比插入元素小,那么待插入元素是所有需要出栈的元素右边第一个更大的数; (可用来求每个元素右边更大的第一个元素)
4.最后一定会留下最大的数(对较大的数更有利)

递减栈:(从栈顶到栈底递减)
1.元素入栈之后,其下面的元素一定是其左边第一个比它小的数;(可用来求每个元素左边更小的第一个元素)
2.若在元素插入之前,栈顶元素比插入元素更大,那么栈顶元素一定是待插入元素左边一个更大的数
3.若在元素插入之前,栈顶元素比插入元素更大,那么栈顶元素一定是所有需要出栈的元素右边更小的数;(可用来求每个元素右边更小的第一个元素)
4.最后一定会留下最小的数(对较小 的数更有利)
*/

单调栈单调队列都是常用的数据结构,用于解决特定的问题。它们的特性可以用来估计时间复杂度。 **单调栈(Monotonic Stack)**:单调栈在处理一些需要按特定顺序访问元素的问题时非常有用。如果一个栈的元素值在遍历过程中保持单调递减或递增(即,对于栈中的每个元素,其后的元素都小于或大于它),那么这个栈就被称为单调栈单调栈的时间复杂度通常取决于问题的特性,但通常在最坏情况下是O(n),其中n是问题的规模。这是因为每次访问一个新的元素,都需要将其压入栈中,这需要O(1)时间,但压入元素后的所有后续操作(例如,弹出元素和查看栈顶元素)都需要遍历整个栈,这需要O(n)时间。 **单调队列(Monotonic Queue)**:单调队列通常用于解决需要维护一个单调序列的问题。如果一个队列的元素值在遍历过程中保持单调递增或递减(即,对于队列中的每个元素,它后面的所有元素都小于或大于它),那么这个队列就被称为单调队列。对于单调队列,如果我们遍历一次队列并将结果放入一个新的列表中,那么时间复杂度就是O(n)。这是因为我们需要遍历整个队列来获取结果,而这个过程需要O(n)时间。然而,如果我们使用一个单调栈来维护这个队列,那么时间复杂度就可以降低到O(n log k),其中k是队列中元素的数量。 以上是对这两种数据结构的时间复杂度的基本理解,但请注意,具体的时间复杂度可能会根据问题的具体情况和使用的算法有所不同。在处理实际问题时,最好能够理解问题本身的特点,选择最合适的数据结构和算法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值