返回

勇闯LeetCode 641:洞悉循环双端队列设计精髓,揭秘算法奥秘

前端

剖析循环双端队列的设计思路

循环双端队列是一种特殊的线性数据结构,它允许在队列的两端进行插入和删除操作。与普通队列不同,循环双端队列的尾部和头部是相连的,形成一个环形结构。这种设计使循环双端队列能够在有限的空间内存储更多的数据,并且可以在头部和尾部同时进行操作,提高了效率。

为了实现循环双端队列,我们需要定义一个固定大小的数组来存储数据,并使用两个指针来分别指向队列的头部和尾部。当在队列头部插入数据时,头部指针向前移动一位,如果头部指针到达数组末尾,则循环回到数组开头。当在队列尾部插入数据时,尾部指针向后移动一位,如果尾部指针到达数组开头,则循环回到数组末尾。

算法实现步骤

  1. 定义一个固定大小的数组来存储数据。
  2. 使用两个指针分别指向队列的头部和尾部。
  3. 在队列头部插入数据时,头部指针向前移动一位,如果头部指针到达数组末尾,则循环回到数组开头。
  4. 在队列尾部插入数据时,尾部指针向后移动一位,如果尾部指针到达数组开头,则循环回到数组末尾。
  5. 在队列头部删除数据时,头部指针向后移动一位,如果头部指针到达数组开头,则循环回到数组末尾。
  6. 在队列尾部删除数据时,尾部指针向前移动一位,如果尾部指针到达数组末尾,则循环回到数组开头。

示例代码

class CircularDeque:
    def __init__(self, k):
        self.size = k
        self.queue = [None] * k
        self.head = 0
        self.tail = 0

    def insertFront(self, value):
        if (self.tail + 1) % self.size == self.head:
            raise IndexError("Queue is full")
        self.queue[self.head] = value
        self.head = (self.head - 1) % self.size

    def insertLast(self, value):
        if (self.tail + 1) % self.size == self.head:
            raise IndexError("Queue is full")
        self.queue[self.tail] = value
        self.tail = (self.tail + 1) % self.size

    def deleteFront(self):
        if self.head == self.tail:
            raise IndexError("Queue is empty")
        value = self.queue[self.head]
        self.head = (self.head + 1) % self.size
        return value

    def deleteLast(self):
        if self.head == self.tail:
            raise IndexError("Queue is empty")
        self.tail = (self.tail - 1) % self.size
        value = self.queue[self.tail]
        return value

    def getFront(self):
        if self.head == self.tail:
            raise IndexError("Queue is empty")
        return self.queue[self.head]

    def getRear(self):
        if self.head == self.tail:
            raise IndexError("Queue is empty")
        return self.queue[self.tail]

    def isEmpty(self):
        return self.head == self.tail

    def isFull(self):
        return (self.tail + 1) % self.size == self.head

结语

循环双端队列是一种非常实用的数据结构,它可以在有限的空间内存储更多的数据,并且可以在头部和尾部同时进行操作,提高了效率。掌握循环双端队列的设计思路和算法实现步骤,对于解决LeetCode 641题目的挑战至关重要。希望本文的详细讲解能够帮助你轻松理解并解决这一算法难题。