单调队列(Monotonic Queue)
双端队列: deque(double ended queue)是可以在首尾两端进/出元素的队列
定义:
一种特殊的队列数据结构,它满足一定的单调性规则。元素按照一定的单调性规则排列,可以是递增或递减。可以在队列的两端进行插入和删除操作,但只能在队尾插入元素和在队头删除元素。
适用场景:
单调队列可以用来解决一些区间最值相关的问题,例如滑动窗口的最大值或最小值等。单调队列的时间复杂度通常是O(n).
具体步骤(单调递减):
1.遍历数组,将元素依次添加到单调队列中。
2.在添加元素时,从队尾开始比较,将小于当前插入元素的队尾元素从队尾删除,保持队列的单调性。
3.队头一直保存当前窗口的最大值。
4.如果队头元素已超过当前窗口范围,从队头删除该元素。
5.遍历完整个数组后,队头元素即位滑动窗口的最大值。
对应力扣题目:
单调栈(Monotonic Stack)
定义:
一种特殊的栈数据结构,它满足一定的单调性规则。单调栈主要用于解决一些与元素之间的大小关系相关的问题,比如找到每个元素的下一个更大元素或下一个更小元素。
使用场景:
使用单调栈可以解决一些常见问题,如找到每个元素的下一个更大元素或下一个更小元素。
具体步骤(递增栈 从栈顶递增至栈底):
1.遍历数组,将元素依次入栈(根据题目可以存储值和数组下标)。
2.在入栈时,与栈顶元素比较,如果当前元素大于栈顶元素,则栈顶元素找到了下一个更大元素,并出栈。
3.对于出栈的元素 做处理,此时入栈元素继续与新的栈顶元素比较,直到找到比当前元素大元素或栈为空。
4. 将当前元素入栈。
5.遍历完整个数组后,栈中剩余的元素即为没有找到下一个更大元素或更小元素的元素。