Python数据结构与算法的双端队列详解
双端队列(deque)是一种具有队列和栈的性质的数据结构。与队列和栈不同的是双端队列允许从两端添加和删除元素。Python语言中内置了deque模块,使得在实现双端队列时更加方便快捷。
1.双端队列基本操作
from collections import deque
# 创建双端队列
d = deque()
# 在队首添加元素
d.appendleft(1)
# 在队尾添加元素
d.append(2)
# 在队首删除元素
d.popleft()
# 在队尾删除元素
d.pop()
# 获取队首元素
d[0]
# 获取队尾元素
d[-1]
# 查询队列大小
len(d)
2. 双端队列应用之滑动窗口
在相关数据结构的问题中,滑动窗口经常被用来解决子串或者子数组的问题。比如搜素连续的字串,搜素在窗口中的某些属性是否符合条件等。
示例:给出一组序列和一个整数k,求序列中所有长度为k的子串的最大值。
from collections import deque
def maxSlidingWindow(nums, k):
# 维护一个双端队列
d = deque()
result = []
for i in range(len(nums)):
# 只有队列尾部的元素小于等于当前数字,此时该元素变得不重要,弹出它
while d and nums[d[-1]] <= nums[i]:
d.pop()
# 存储数字下标
d.append(i)
# 队列头部存储的下标是最大值,判断当前下标是否在合法范围内
if d[0] < (i - k + 1):
# 超出范围,弹出头部下标
d.popleft()
# 找到了一个子窗口,记录窗口中的最大值
if i >= k - 1:
result.append(nums[d[0]])
return result
使用 maxSlidingWindow([1,3,-1,-3,5,3,6,7], 3)
就能得到结果 [3, 3, 5, 5, 6, 7]
。
3. 结语
双端队列是一种经常被用到的数据结构,它能够更加有效地解决问题。通过Python内置模块deque,实现双端队列的代码会更加简洁优美。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据结构与算法的双端队列详解 - Python技术站