单调队列和单调栈
时间: 2025-06-05 09:31:59 浏览: 10
### 单调队列与单调栈的原理、区别及应用场景
#### 一、单调栈的原理
单调栈是一种特殊的栈结构,其核心特点是栈内的元素保持单调性(递增或递减)。在实际应用中,当新元素入栈时,会从栈顶开始移除所有破坏单调性的元素,然后将新元素压入栈中。这种特性使得单调栈特别适合解决“Next Greater Element”类问题,即找到每个元素右侧第一个比它大的元素[^1]。
```python
def next_greater_element(nums):
stack = []
result = [-1] * len(nums) # 初始化结果数组
for i in range(len(nums)):
while stack and nums[stack[-1]] < nums[i]:
idx = stack.pop()
result[idx] = nums[i]
stack.append(i)
return result
```
#### 二、单调队列的原理
单调队列是一种特殊的队列结构,其核心特点是队列内的元素保持单调性(递增或递减)。在实际应用中,当新元素入队时,会从队尾开始移除所有破坏单调性的元素,然后将新元素加入队尾。同时,当滑动窗口移动时,需要从队首移除那些已经不在当前窗口范围内的元素[^4]。这种特性使得单调队列特别适合解决滑动窗口最大值或最小值问题。
```python
from collections import deque
def sliding_window_maximum(nums, k):
queue = deque()
result = []
for i in range(len(nums)):
while queue and nums[queue[-1]] <= nums[i]:
queue.pop()
queue.append(i)
if queue[0] <= i - k:
queue.popleft()
if i >= k - 1:
result.append(nums[queue[0]])
return result
```
#### 三、单调栈与单调队列的区别
1. **数据结构类型**:单调栈是基于后进先出(LIFO)的数据结构,而单调队列是基于先进先出(FIFO)的数据结构。
2. **操作顺序**:单调栈的操作主要发生在栈顶,而单调队列的操作既涉及队首(移除过期元素),也涉及队尾(维护单调性)。
3. **适用场景**:单调栈适用于解决“Next Greater Element”类问题,而单调队列适用于解决滑动窗口最大值或最小值问题[^2]。
#### 四、应用场景
- **单调栈的应用场景**:
- 寻找数组中每个元素右侧第一个比它大或小的元素[^1]。
- 计算直方图中最大的矩形面积[^2]。
- **单调队列的应用场景**:
- 求解滑动窗口内的最大值或最小值[^3]。
- 时间序列的范围查询[^3]。
#### 五、总结
单调栈和单调队列都是高效的算法工具,能够显著降低时间复杂度。选择使用哪种结构取决于具体问题的需求。如果问题是关于元素间有序性的问题,如“Next Greater Element”,则优先考虑单调栈;如果问题是关于滑动窗口的最大值或最小值,则优先考虑单调队列。
---
阅读全文
相关推荐















