• LeetCode 622. 设计循环队列


    622. 设计循环队列

    题目:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
    循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
    链接 https://leetcode.cn/problems/design-circular-queue

    个人思路

    1. 数组:通过操作数组的索引构建一个虚拟的首尾相连的环。在循环队列结构中,设置一个队尾 rear 与队首 front,且大小固定在循环队列中,当队列为空,可知 front=rear;而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,假设队列使用的数组有capacity 个存储空间,则此时规定循环队列最多只能有capacity−1 个队列元素,当循环队列中只剩下一个空存储单元时,则表示队列已满。根据以上可知,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1) mod capacity。
      对于一个固定大小的数组,只要知道队尾rear 与队首 front,即可计算出队列当前的长度:
      (rear−front+capacity) mod capacity
    class MyCircularQueue:
        def __init__(self, k: int):
            self.front = self.rear = 0
            self.elements = [0] * (k + 1)
    
        def enQueue(self, value: int) -> bool:
            if self.isFull():
                return False
            self.elements[self.rear] = value
            self.rear = (self.rear + 1) % len(self.elements)
            return True
    
        def deQueue(self) -> bool:
            if self.isEmpty():
                return False
            self.front = (self.front + 1) % len(self.elements)
            return True
    
        def Front(self) -> int:
            return -1 if self.isEmpty() else self.elements[self.front]
    
        def Rear(self) -> int:
            return -1 if self.isEmpty() else self.elements[(self.rear - 1) % len(self.elements)]
    
        def isEmpty(self) -> bool:
            return self.rear == self.front
    
        def isFull(self) -> bool:
            return (self.rear + 1) % len(self.elements) == self.front
    
    
    # Your MyCircularQueue object will be instantiated and called as such:
    # obj = MyCircularQueue(k)
    # param_1 = obj.enQueue(value)
    # param_2 = obj.deQueue()
    # param_3 = obj.Front()
    # param_4 = obj.Rear()
    # param_5 = obj.isEmpty()
    # param_6 = obj.isFull()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    复杂度分析
    时间复杂度:初始化和每项操作的时间复杂度均为 O(1)。
    空间复杂度:O(k),其中 k 为给定的队列元素数目。

    其他思路

    1. 链表
      我们同样可以用链表实现队列,用链表实现队列则较为简单,因为链表可以在 O(1)O(1) 时间复杂度完成插入与删除。入队列时,将新的元素插入到链表的尾部;出队列时,将链表的头节点返回,并将头节点指向下一个节点。
    class MyCircularQueue:
        def __init__(self, k: int):
            self.head = self.tail = None
            self.capacity = k
            self.size = 0
    
        def enQueue(self, value: int) -> bool:
            if self.isFull():
                return False
            node = ListNode(value)
            if self.head is None:
                self.head = node
                self.tail = node
            else:
                self.tail.next = node
                self.tail = node
            self.size += 1
            return True
    
        def deQueue(self) -> bool:
            if self.isEmpty():
                return False
            self.head = self.head.next
            self.size -= 1
            return True
    
        def Front(self) -> int:
            return -1 if self.isEmpty() else self.head.val
    
        def Rear(self) -> int:
            return -1 if self.isEmpty() else self.tail.val
    
        def isEmpty(self) -> bool:
            return self.size == 0
    
        def isFull(self) -> bool:
            return self.size == self.capacity
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    复杂度分析
    时间复杂度:初始化和每项操作的时间复杂度均为 O(1)。
    空间复杂度:O(k),其中 k 为给定的队列元素数目。

    作者:LeetCode-Solution
    链接:https://leetcode.cn/problems/design-circular-queue/solution/she-ji-xun-huan-dui-lie-by-leetcode-solu-1w0a/

  • 相关阅读:
    线性代数的本质(四)——行列式
    1413. Minimum Value to Get Positive Step by Step Sum
    怎样查询服务器位置和IP地址?
    计算机网络(自顶向下方法)-链路层和局域网
    MediaCodec同步异步使用
    6块钱改变世界,网易和拼多多踏入同一条河流?
    K210入门 MAIX DOCK——点灯(二)
    log4j2漏洞复现以及解决方案
    MAX/MSP SDK学习03:Atoms and Messages的使用
    应用在儿童平板防蓝光中的LED防蓝光灯珠
  • 原文地址:https://blog.csdn.net/weixin_48127034/article/details/126130954