Python数据结构与算法的双端队列详解

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技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • java数据结构基础:线性表

    Java数据结构基础:线性表 简介 线性表是指数据元素之间存在线性关系的数据结构,即数据元素之间有前后直接关系,且第一个元素没有前驱,最后一个元素没有后继。线性表可以用数组或者链表两种方式实现。 数组实现线性表 线性表的数组实现即为将线性表中的元素放在一个一维数组中,使用数组下标表示元素的位置。由于数组随机访问元素的时间复杂度为O(1),因此在随机访问比较多…

    数据结构 2023年5月17日
    00
  • 腾讯2018秋招正式笔试题目小结

    腾讯2018秋招正式笔试题目小结 背景介绍 腾讯作为中国科技领域的佼佼者,每年都会举行大规模的招聘,吸引着众多优秀的应聘者前来。其中,笔试是选拔过程中的重要环节,也是一个入职的关键。本文旨在对腾讯2018秋招正式笔试的题目进行详细的分析和总结,帮助广大应聘者更好地进行准备。 题目类型 腾讯2018秋招正式笔试共分为两个部分:编程题和客观题。编程题主要考察应聘…

    数据结构 2023年5月17日
    00
  • 自学1

    Problem1 明明的随机数 ## 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数 (N <= 100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“…

    算法与数据结构 2023年4月24日
    00
  • 浅谈Python描述数据结构之KMP篇

    浅谈Python描述数据结构之KMP篇 简介 本篇文章将着重介绍KMP算法,其中包含KMP算法的基本原理、实现步骤以及Python代码实现示例。KMP算法是一种高效的字符串匹配算法,它可以在O(m+n)的时间内完成字符串的匹配操作,其中m和n分别为主串和模式串的长度。 基本原理 KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,它的…

    数据结构 2023年5月17日
    00
  • Python嵌套式数据结构实例浅析

    Python嵌套式数据结构实例浅析 介绍 在Python中,数据结构是非常重要的。Python中的嵌套数据结构给我们提供了非常灵活的使用方式。例如,我们可以使用嵌套式列表和字典来处理复杂的数据结构问题。在本文中,我将向您介绍Python中嵌套式数据结构的使用方法和示例代码。 嵌套式列表 首先,让我们来看看使用Python中的嵌套式列表。嵌套式列表是列表嵌套的…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法

    JavaScript数据结构与算法完整攻略 什么是数据结构与算法 数据结构和算法是计算机科学的重要组成部分,常用于解决数据处理问题的方法与技术。数据结构是指存储和组织数据的方式,而算法则是解决数据处理问题的途径和方法。 数据结构分类 数据结构可分为以下几类: 数组 —— 存储有序元素集合的线性结构; 栈 —— 一种后进先出的数据结构; 队列 —— 一种先进先…

    数据结构 2023年5月17日
    00
  • java数据结构与算法数组模拟队列示例详解

    下面是“java数据结构与算法数组模拟队列示例详解”的完整攻略。 标题 Java数据结构与算法:数组模拟队列示例详解 简介 本文将以Java语言为例,详细讲解如何使用数组模拟队列。对于初学者来说,队列是一个非常基础的数据结构,掌握其实现方法可以帮助进一步理解其他的数据结构和算法。 队列的定义 队列(Queue)是一种先进先出(First In First O…

    数据结构 2023年5月17日
    00
  • Java数据结构之线段树的原理与实现

    Java数据结构之线段树的原理与实现 什么是线段树 线段树是一种基于分治思想的数据结构,它可以用来解决各种区间查询问题,例如区间求和、最大值、最小值等等。在算法竞赛和数据结构课程中,线段树被广泛应用,是一种非常实用的数据结构。 线段树的基本原理 线段树是一种二叉树,它的每个节点包含一个区间,叶子节点表示区间中的单个元素,非叶子节点表示区间的合并。 线段树的建…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部