您当前的位置: 首页 >  Python

Better Bench

暂无认证

  • 2浏览

    0关注

    695博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Leetcode刷题Python】641.循环双端队列

Better Bench 发布时间:2022-06-01 22:23:08 ,浏览量:2

1 题目

设计实现双端队列。 你的实现需要支持以下操作:

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

2 解析

需要初始一个长度为k+1的数组和两个指针,因为为了避免「队列为空」和「队列为满」的判别条件冲突,我们有意占用一个空位置;

front:指向队列头部第 1 个有效数据的位置; rear:指向队列尾部(即最后 1 个有效数据)的 下一个位置,即下一个从队尾入队元素的位置。

(1)insertFront() 在头部插入后,指针前移一位 front = (front-1+L)%L L表示数组长度 (2)insertLast() 在尾部插入后,指针后移一位 rear = (rear+1)%L L表示数组长度

(3)deleteFront() 只需要指针后移一位 front = (front+1)%L (4)deleteLast() 只需要指针前移一位 rear = (rear-1+L)%L (5)getFront() 根据front指针取值即可 (6)getRear() 注意: 因为数组多了一个占位符,倒数第二个才是真正rear的位置,再取值 index = (rear-1+L)%L

(7)isEmpty() 判别队列为空的条件是:front == rear; (8)isFull() 判别队列为满的条件是:(rear + 1) % capacity == front

3 python 实现


class MyCircularDeque:

    def __init__(self, k: int):
        self.front = 0
        self.rear = 0
        self.capacity = k+1
        self.arr = [0]*self.capacity

    def insertFront(self, value: int) -> bool:
        if self.isFull():
            return False
        self.front = (self.front-1+self.capacity)%self.capacity
        self.arr[self.front] = value
        return True

    def insertLast(self, value: int) -> bool:
        if self.isFull():
            return False
        self.arr[self.rear] = value
        self.rear = (self.rear+1)%self.capacity
        return True

    def deleteFront(self) -> bool:
        if self.isEmpty():
            return False
        self.front = (self.front+1)%self.capacity
        return True

    def deleteLast(self) -> bool:
        if self.isEmpty():
            return False
        self.rear = (self.rear-1+self.capacity)%self.capacity
        return True

    def getFront(self) -> int:
        if self.isEmpty():
            return -1
        return self.arr[self.front]
    def getRear(self) -> int:
        if self.isEmpty():
            return -1
        return self.arr[(self.rear-1+self.capacity)%self.capacity]

    def isEmpty(self) -> bool:
        return self.front ==self.rear

    def isFull(self) -> bool:
        return (self.rear+1)%self.capacity==self.front
关注
打赏
1665674626
查看更多评论
立即登录/注册

微信扫码登录

0.0411s