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日

相关文章

  • Codeforces Round 867 (Div. 3)

    A. TubeTube Feed 分析: 从所有a[i]+i-1<=t的选择种取个max即可 code: #include <bits/stdc++.h> using namespace std; const int N = 55; int a[N], b[N]; int main() { std::ios::sync_with_stdio…

    算法与数据结构 2023年5月4日
    00
  • C语言数据结构实现字符串分割的实例

    C语言中数据结构实现字符串分割可以用到两种常见数据结构:指针和数组。 方法一:指针 步骤一:创建指针 首先声明一个指针类型的变量,用来存储字符串中单个字符所在的地址: char *ptr; 步骤二:遍历字符串 通过对字符串进行遍历,在每个分隔符位置上获取单词,并通过指针记录下每个单词的地址: char str[] = "C语言-数据结构-字符串分割…

    数据结构 2023年5月17日
    00
  • C语言数据结构中定位函数Index的使用方法

    C语言的数据结构中,定位函数Index的使用方法主要涉及到数组和指针的相关操作。Index函数的作用是在数组中查找对应的元素,返回该元素的索引位置。以下是详细攻略: 一、Index函数的用法 Index函数的原型如下: void *index(const void *s, int c, size_t n); 其中,参数含义如下: s: 要查找的数组 c: 要…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表的查找和建立

    C语言数据结构之单链表的查找和建立 什么是单链表? 单链表是一种常见的数据结构,是由若干个节点(Node)组成的链式结构,每个节点存储着链表中的元素和指向下一个节点的指针。 单链表的优点是插入、删除元素简单,但是查找元素比较困难。 在C语言中,我们可以使用结构体来定义一个节点: struct ListNode { int val; struct ListNo…

    数据结构 2023年5月17日
    00
  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

    数据结构 2023年5月17日
    00
  • C语言链表案例学习之通讯录的实现

    让我详细讲解一下“C语言链表案例学习之通讯录的实现”的完整攻略。 1. 案例简介 本案例的目的是通过实现一个简单的通讯录程序,来学习C语言链表的原理和操作。程序主要功能涵盖通讯录添加、删除、修改以及查询。 2. 程序架构 程序的整体结构如下所示: 头文件声明 结构体定义 函数声明 主函数 函数实现 其中,头文件声明包含stdio.h、stdlib.h以及st…

    数据结构 2023年5月17日
    00
  • JS数据结构之队列结构详解

    JS数据结构之队列结构详解 什么是队列结构? 队列结构是一种遵循先进先出(FIFO)原则的线性数据结构,它可以用来存储一系列待处理的数据,其中队首是最先进入队列的元素,队尾是最后进入队列的元素。 在队列中,添加元素的操作叫做enqueue,移除元素的操作叫做dequeue。同时,队列还包括peek方法,查看队列头的元素,以及isEmpty方法,判断队列是否为…

    数据结构 2023年5月17日
    00
  • Oracle 11g Release (11.1) 索引底层的数据结构

    我来为您详细讲解“Oracle 11g Release (11.1) 索引底层的数据结构”的完整攻略。 索引底层数据结构简介 在Oracle数据库中,索引底层数据结构是B树(B-Tree)。B树是一种常用的多路平衡查找树,它的特点是每个节点都有多个子节点,能够自动调整高度,保持所有叶子节点到根节点的距离相等。在B树中,每个节点都有一个关键字列表和一个指向子节…

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