• 【LeetCode】641. 设计循环双端队列


    题目

    641. 设计循环双端队列

    设计实现双端队列。

    实现 MyCircularDeque 类:

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

    示例 1:

    输入
    ["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
    [[3], [1], [2], [3], [4], [], [], [], [4], []]
    输出
    [null, true, true, true, false, 2, true, true, true, 4]
    
    解释
    MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
    circularDeque.insertLast(1);			        // 返回 true
    circularDeque.insertLast(2);			        // 返回 true
    circularDeque.insertFront(3);			        // 返回 true
    circularDeque.insertFront(4);			        // 已经满了,返回 false
    circularDeque.getRear();  				// 返回 2
    circularDeque.isFull();				        // 返回 true
    circularDeque.deleteLast();			        // 返回 true
    circularDeque.insertFront(4);			        // 返回 true
    circularDeque.getFront();				// 返回 4
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    提示:

    • 1 <= k <= 1000
    • 0 <= value <= 1000
    • insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull 调用次数不大于 2000

    思路

    • 使用环形数组表示队列
    • 首指针指向队首,尾指针指向队尾后一个数字
    • 当首尾指针重合则说明队列为空,当尾指针后一格是手指针则说明队列满
    • 增删查直接通过首尾指针进行

    代码

    class MyCircularDeque:
        
        def __init__(self, k: int):
            self.queue = [0] * (k+1)
            self.head = self.tail = 0
    
        def insertFront(self, value: int) -> bool:
            if self.isFull(): return False
            self.head -= 1
            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+=1
            return True
    
        def deleteFront(self) -> bool:
            if self.isEmpty(): return False
            self.head += 1
            return True
    
        def deleteLast(self) -> bool:
            if self.isEmpty(): return False
            self.tail -= 1
            return True
    
        def getFront(self) -> int:
            if self.isEmpty(): return -1
            return self.queue[self.head%len(self.queue)]
    
        def getRear(self) -> int:
            if self.isEmpty(): return -1
            return self.queue[(self.tail-1)%len(self.queue)]
    
        def isEmpty(self) -> bool:
            return self.head%len(self.queue) == self.tail%len(self.queue)
    
        def isFull(self) -> bool:
            return (self.tail+1)%len(self.queue) == self.head%len(self.queue)
    
    
    # Your MyCircularDeque object will be instantiated and called as such:
    # obj = MyCircularDeque(k)
    # param_1 = obj.insertFront(value)
    # param_2 = obj.insertLast(value)
    # param_3 = obj.deleteFront()
    # param_4 = obj.deleteLast()
    # param_5 = obj.getFront()
    # param_6 = obj.getRear()
    # param_7 = obj.isEmpty()
    # param_8 = 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
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    复杂度

    • 时间复杂度:所有操作均为 O ( 1 ) O(1) O(1)
    • 空间复杂度:所有操作均为 O ( 1 ) O(1) O(1)
  • 相关阅读:
    Flink / Scala - java.lang.NumberFormatException: Not a version: 9
    在vue3项目中使用el-tabs切换标签页时echarts图表显示不正确
    【8】Docker中部署Redis
    记一次 Redisson 线上问题 → ERR unknown command 'WAIT' 的排查与分析
    90分工作60分汇报!不会写报告,干再多活领导都看不见!(附模板)
    linux常用命令
    electron builder打包后运行问题
    模态贡献量在汽车NVH分析中的案例应用
    构建企业分支网络
    Node.js 入门教程 19 package-lock.json 文件
  • 原文地址:https://blog.csdn.net/apple_50661801/article/details/126339832