单调队列与单调栈

316 阅读2分钟

单调队列(Monotonic Queue)

双端队列: deque(double ended queue)是可以在首尾两端进/出元素的队列

定义:

一种特殊的队列数据结构,它满足一定的单调性规则。元素按照一定的单调性规则排列,可以是递增或递减。可以在队列的两端进行插入和删除操作,但只能在队尾插入元素和在队头删除元素。

适用场景:  

单调队列可以用来解决一些区间最值相关的问题,例如滑动窗口的最大值或最小值等。单调队列的时间复杂度通常是O(n).

具体步骤(单调递减):

1.遍历数组,将元素依次添加到单调队列中。

2.在添加元素时,从队尾开始比较,将小于当前插入元素的队尾元素从队尾删除,保持队列的单调性。

3.队头一直保存当前窗口的最大值。

4.如果队头元素已超过当前窗口范围,从队头删除该元素。

5.遍历完整个数组后,队头元素即位滑动窗口的最大值。

对应力扣题目:

239.滑动窗口最大值

826.和至少为K的最短子数组

1438.绝对差不超过限制的最长连续子数组

单调栈(Monotonic Stack)

定义:

一种特殊的栈数据结构,它满足一定的单调性规则。单调栈主要用于解决一些与元素之间的大小关系相关的问题,比如找到每个元素的下一个更大元素或下一个更小元素。

使用场景:

使用单调栈可以解决一些常见问题,如找到每个元素的下一个更大元素或下一个更小元素。

具体步骤(递增栈 从栈顶递增至栈底):

1.遍历数组,将元素依次入栈(根据题目可以存储值和数组下标)。

2.在入栈时,与栈顶元素比较,如果当前元素大于栈顶元素,则栈顶元素找到了下一个更大元素,并出栈。

3.对于出栈的元素 做处理,此时入栈元素继续与新的栈顶元素比较,直到找到比当前元素大元素或栈为空。

4. 将当前元素入栈。

5.遍历完整个数组后,栈中剩余的元素即为没有找到下一个更大元素或更小元素的元素。

对应力扣题目:

739.每日温度

496.下一个元素更大

316.去除重复字母