【Leetcode刷题Python】641.循环双端队列

简介: 文章介绍了如何实现一个循环双端队列,包括其操作如插入、删除、获取队首和队尾元素,以及检查队列是否为空或已满,并提供了Python语言的实现代码。

1 题目

设计实现双端队列。
你的实现需要支持以下操作:

MyCircularDeque(k):构造函数,双端队列的大小为k。
insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
isEmpty():检查双端队列是否为空。
isFull():检查双端队列是否满了。

2 解析

需要初始一个长度为k+1的数组和两个指针,因为为了避免「队列为空」和「队列为满」的判别条件冲突,我们有意占用一个空位置;

front:指向队列头部第 1 个有效数据的位置;
rear:指向队列尾部(即最后 1 个有效数据)的 下一个位置,即下一个从队尾入队元素的位置。

(1)insertFront()
在头部插入后,指针前移一位
front = (front-1+L)%L
L表示数组长度
(2)insertLast()
在尾部插入后,指针后移一位
rear = (rear+1)%L
L表示数组长度

(3)deleteFront()
只需要指针后移一位
front = (front+1)%L
(4)deleteLast()
只需要指针前移一位
rear = (rear-1+L)%L
(5)getFront()
根据front指针取值即可
(6)getRear()
注意:
因为数组多了一个占位符,倒数第二个才是真正rear的位置,再取值
index = (rear-1+L)%L

(7)isEmpty()
判别队列为空的条件是:front == rear;
(8)isFull()
判别队列为满的条件是:(rear + 1) % capacity == front

3 python 实现



class MyCircularDeque:

    def __init__(self, k: int):
        self.front = 0
        self.rear = 0
        self.capacity = k+1
        self.arr = [0]*self.capacity

    def insertFront(self, value: int) -> bool:
        if self.isFull():
            return False
        self.front = (self.front-1+self.capacity)%self.capacity
        self.arr[self.front] = value
        return True

    def insertLast(self, value: int) -> bool:
        if self.isFull():
            return False
        self.arr[self.rear] = value
        self.rear = (self.rear+1)%self.capacity
        return True

    def deleteFront(self) -> bool:
        if self.isEmpty():
            return False
        self.front = (self.front+1)%self.capacity
        return True

    def deleteLast(self) -> bool:
        if self.isEmpty():
            return False
        self.rear = (self.rear-1+self.capacity)%self.capacity
        return True

    def getFront(self) -> int:
        if self.isEmpty():
            return -1
        return self.arr[self.front]
    def getRear(self) -> int:
        if self.isEmpty():
            return -1
        return self.arr[(self.rear-1+self.capacity)%self.capacity]

    def isEmpty(self) -> bool:
        return self.front ==self.rear

    def isFull(self) -> bool:
        return (self.rear+1)%self.capacity==self.front
目录
相关文章
|
1月前
|
机器学习/深度学习 算法 关系型数据库
Python循环进阶:嵌套与控制的深度解析
本文深入探讨Python中嵌套循环的原理与应用,从数学模型到工程实践全面解析。内容涵盖嵌套循环的本质(如笛卡尔积实现、变量作用域)、精细控制技巧(如break/continue、迭代器协议、异常处理),以及性能优化策略(预计算、向量化等)。同时结合树形结构遍历、动态规划、游戏开发等典型场景,提供最佳实践建议。掌握这些技巧,助你突破编程瓶颈,实现复杂问题的优雅解决。
71 6
|
2月前
|
存储 Shell 开发者
Python用户输入与While循环
本文介绍了Python中用户输入与while循环的结合使用,通过`input()`函数获取用户输入,并利用while循环实现重复操作,如创建交互式程序或用户驱动的循环。示例代码展示了如何让用户输入数字并计算总和,直到输入指定退出命令。这种组合能帮助开发者构建强大的交互式Python应用。
|
7月前
|
开发工具 Python
[oeasy]python043_自己制作的ascii码表_循环语句_条件语句_缩进_indent
本文介绍了如何使用Python制作ASCII码表,回顾了上一次课程中`print`函数的`end`参数,并通过循环和条件语句实现每8个字符换行的功能。通过调整代码中的缩进,实现了正确的输出格式。最后展示了制作完成的ASCII码表,并预告了下一次课程的内容。
69 2
|
7月前
|
Python
在 Python 中实现各种类型的循环判断
在 Python 中实现各种类型的循环判断
130 2
|
7月前
|
Python
Python 中,循环判断
Python 中,循环判断
130 1
|
7月前
|
人工智能 Python
[oeasy]python039_for循环_循环遍历_循环变量
本文回顾了上一次的内容,介绍了小写和大写字母的序号范围,并通过 `range` 函数生成了 `for` 循环。重点讲解了 `range(start, stop)` 的使用方法,解释了为什么不会输出 `stop` 值,并通过示例展示了如何遍历小写和大写字母的序号。最后总结了 `range` 函数的结构和 `for` 循环的使用技巧。
82 6
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
184 1
|
8月前
|
Java 索引 Python
【10月更文挑战第19天】「Mac上学Python 30」基础篇11 - 高级循环技巧与应用
本篇将介绍更深入的循环应用与优化方法,重点放在高级技巧和场景实践。我们将讲解enumerate()与zip()的妙用、迭代器与生成器、并发循环以及性能优化技巧。这些内容将帮助您编写更高效、结构更合理的代码。
113 5
|
8月前
|
搜索推荐 Python
Leecode 101刷题笔记之第五章:和你一起你轻松刷题(Python)
这篇文章是关于LeetCode第101章的刷题笔记,涵盖了多种排序算法的Python实现和两个中等难度的编程练习题的解法。
77 3
|
8月前
|
数据安全/隐私保护 Python
Python循环语句
【10月更文挑战第7天】
113 2

热门文章

最新文章

推荐镜像

更多