1. deque
(双端队列)
定义
deque
(读作 “deck”,即双端队列)是一个支持从两端高效添加和删除元素的数据结构。相比列表(list
)在头部操作的 O(n) 时间复杂度,deque
的两端操作都是 O(1)。
用途
- 队列和栈:可以用
deque
实现 FIFO(队列)或 LIFO(栈)。 - 滑动窗口:在处理固定大小的窗口问题时,
deque
适合维护窗口内的元素。 - BFS(广度优先搜索):
deque
常用于实现队列。 - 字符串或数组的双端操作:需要频繁在两端添加/删除元素时。
常用方法
append(x)
:在右端添加元素 x。appendleft(x)
:在左端添加元素 x。pop()
:移除并返回右端元素。popleft()
:移除并返回左端元素。extend(iterable)
:将可迭代对象中的元素添加到右端。extendleft(iterable)
:将可迭代对象中的元素添加到左端(注意顺序会反转)。clear()
:清空队列。rotate(n)
:将队列向右旋转 n 步(n 为负数时向左旋转)。
示例代码
from collections import deque
# 创建一个双端队列
d = deque([1, 2, 3])
# 添加元素
d.append(4) # d = deque([1, 2, 3, 4])
d.appendleft(0) # d = deque([0, 1, 2, 3, 4])
# 删除元素
right = d.pop() # right = 4, d = deque([0, 1, 2, 3])
left = d.popleft() # left = 0, d = deque([1, 2, 3])
# 旋转
d.rotate(1) # d = deque([3, 1, 2])
d.rotate(-1) # d = deque([1, 2, 3])
print(d) # 输出 deque([1, 2, 3])
竞赛场景
在 BFS 中,deque
是实现队列的首选。例如:
from collections import deque
def bfs(start, graph):
queue = deque([start])
visited = set([start])
while queue:
node = queue.popleft()
print(node, end=' ')
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
# 示例图
graph = {
1: [2, 3],
2: [1, 4],
3: [1, 5],
4: [2],
5: [3