返回
用LeetCode 641纵横驰骋:巧夺循环双端队列
前端
2023-09-03 17:58:51
- 认识循环双端队列
循环双端队列与普通队列类似,但它允许从两端进行插入和删除操作,因此它也称为双向队列或双端队列。循环双端队列在许多实际应用中非常有用,例如缓存、浏览器历史记录和视频编辑等。
2. 实现循环双端队列
实现循环双端队列需要考虑以下几点:
- 队列的容量:确定队列的最大容量,即队列中最多可以存储多少个元素。
- 队列的元素类型:确定队列中存储的元素类型,例如整数、字符串或对象等。
- 队列的内部实现:可以选择使用数组或链表等数据结构来实现队列。
- 队列的操作:需要实现队列的基本操作,包括入队、出队、查看队头元素和队尾元素等。
3. LeetCode 641题详解
LeetCode 641题要求设计实现一个循环双端队列,并支持以下操作:
- MyCircularDeque(k):构造函数,创建一个容量为k的循环双端队列。
- insertFront(value):将一个元素插入队列头部。
- insertLast(value):将一个元素插入队列尾部。
- deleteFront():删除队列头部的元素。
- deleteLast():删除队列尾部的元素。
- getFront():获取队列头部的元素。
- getRear():获取队列尾部的元素。
- isEmpty():检查队列是否为空。
- isFull():检查队列是否已满。
4. 实现步骤
4.1 初始化队列
首先,需要创建一个数组来存储队列的元素。数组的长度应为队列的容量加一,多出来的一个元素用于作为哨兵节点,哨兵节点表示队列的开头和结尾。
class CircularDeque:
def __init__(self, k: int):
self.capacity = k + 1
self.queue = [None] * self.capacity
self.head = 0
self.tail = 0
4.2 入队操作
入队操作包括从头部入队和从尾部入队。
def insertFront(self, value: int) -> bool:
if self.isFull():
return False
self.head = (self.head - 1 + self.capacity) % self.capacity
self.queue[self.head] = value
return True
def insertLast(self, value: int) -> bool:
if self.isFull():
return False
self.queue[self.tail] = value
self.tail = (self.tail + 1) % self.capacity
return True
4.3 出队操作
出队操作包括从头部出队和从尾部出队。
def deleteFront(self) -> bool:
if self.isEmpty():
return False
self.head = (self.head + 1) % self.capacity
return True
def deleteLast(self) -> bool:
if self.isEmpty():
return False
self.tail = (self.tail - 1 + self.capacity) % self.capacity
return True
4.4 获取队头和队尾元素
def getFront(self) -> int:
if self.isEmpty():
return -1
return self.queue[self.head]
def getRear(self) -> int:
if self.isEmpty():
return -1
return self.queue[(self.tail - 1 + self.capacity) % self.capacity]
4.5 判断队列是否为空和已满
def isEmpty(self) -> bool:
return self.head == self.tail
def isFull(self) -> bool:
return (self.tail + 1) % self.capacity == self.head
5. 结语
通过本文对循环双端队列的探索,您已经了解了它的特性、实现方式以及在LeetCode 641题中的应用。掌握循环双端队列的技能可以帮助您解决更多实际问题,提升您的算法和数据结构水平。