返回

用LeetCode 641纵横驰骋:巧夺循环双端队列

前端

  1. 认识循环双端队列

循环双端队列与普通队列类似,但它允许从两端进行插入和删除操作,因此它也称为双向队列或双端队列。循环双端队列在许多实际应用中非常有用,例如缓存、浏览器历史记录和视频编辑等。

2. 实现循环双端队列

实现循环双端队列需要考虑以下几点:

  1. 队列的容量:确定队列的最大容量,即队列中最多可以存储多少个元素。
  2. 队列的元素类型:确定队列中存储的元素类型,例如整数、字符串或对象等。
  3. 队列的内部实现:可以选择使用数组或链表等数据结构来实现队列。
  4. 队列的操作:需要实现队列的基本操作,包括入队、出队、查看队头元素和队尾元素等。

3. LeetCode 641题详解

LeetCode 641题要求设计实现一个循环双端队列,并支持以下操作:

  1. MyCircularDeque(k):构造函数,创建一个容量为k的循环双端队列。
  2. insertFront(value):将一个元素插入队列头部。
  3. insertLast(value):将一个元素插入队列尾部。
  4. deleteFront():删除队列头部的元素。
  5. deleteLast():删除队列尾部的元素。
  6. getFront():获取队列头部的元素。
  7. getRear():获取队列尾部的元素。
  8. isEmpty():检查队列是否为空。
  9. 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题中的应用。掌握循环双端队列的技能可以帮助您解决更多实际问题,提升您的算法和数据结构水平。