题目描述
思路解析动画文字版
这题想让你把固定长度数组当成一个环:下标走到末尾后绕回开头,头尾移动都只改指针。
保留一个空槽后,空和满就不会都长成 front == rear。所有头尾操作都围绕这两个指针定义展开。
初始化 k=3:内部数组开 4 格:front 和 rear 都指向下标 0:这不是满,而是空。满要看 (rear + 1) % cap 是否追上 front。
insertLast(1):写 rear,再后移 rear:尾插时,rear 指向“队尾后面的空位”。先把 1 写到 rear=0,再让 rear 前进到 1。
insertLast(2):继续尾插:再插入 2,写入下标 1,rear 前进到 2。rear 仍然指向下一个可写空槽。
insertFront(3):front 往前绕到 3:头插要先把 front 往前挪一格。0 的前一格通过取模绕到 3,再把 3 写进去。
insertFront(4):满了,拒绝插入:虽然数组下标 2 还是空的,但它正是 rear 指向的保留空槽,不能写。保留它才能区分空和满。
getRear():尾元素在 rear 前一格:rear 自己指向空位,不是尾元素。真正队尾是 (rear - 1) % cap。
isFull():确认队列已满:这一步对应官方示例里的 isFull()。判断满不数元素,只看 rear 再走一步是否撞上 front。
deleteLast():rear 后退并清空尾槽:尾删要先让 rear 回到真正的尾元素位置,再把这个槽清空。现在 rear=1,队尾后空位变成下标 1。
insertFront(4):头插成功:删除尾部以后不满了。front 从 3 往前到 2,写入 4,队首就变成 4。
getFront():直接读 q[front]:front 始终指向队首元素,所以 getFront 只要判空后返回 q[front]。
补看 deleteFront():清空队首并后移 front:头删和尾删方向相反:deleteFront 清空当前 front 槽位,然后让 front 向后走一格,新的队首变成 3。
设计类题最怕边写边改定义。先固定 front/rear 的语义,后面的代码只是把语义翻译成公式。
参考代码
class MyCircularDeque: def __init__(self, k: int): self.cap = k + 1 self.q = [None] * self.cap self.front = 0 self.rear = 0 def insertFront(self, value: int) -> bool: if self.isFull(): return False self.front = (self.front - 1) % self.cap self.q[self.front] = value return True def insertLast(self, value: int) -> bool: if self.isFull(): return False self.q[self.rear] = value self.rear = (self.rear + 1) % self.cap return True def deleteFront(self) -> bool: if self.isEmpty(): return False self.q[self.front] = None self.front = (self.front + 1) % self.cap return True def deleteLast(self) -> bool: if self.isEmpty(): return False self.rear = (self.rear - 1) % self.cap self.q[self.rear] = None return True def getFront(self) -> int: if self.isEmpty(): return -1 return self.q[self.front] def getRear(self) -> int: if self.isEmpty(): return -1 return self.q[(self.rear - 1) % self.cap] def isEmpty(self) -> bool: return self.front == self.rear def isFull(self) -> bool: return (self.rear + 1) % self.cap == self.front复杂度
- 时间复杂度:O(1),每个操作只改常数个下标或数组槽位。
- 空间复杂度:O(k),内部使用长度为 k+1 的数组。
易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题