当前位置:网站首页>LeetCode 每日一题——622. 设计循环队列
LeetCode 每日一题——622. 设计循环队列
2022-08-03 08:01:00 【SK_Jaco】
1.题目描述
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
你的实现应该支持如下操作:
MyCircularQueue(k): 构造器,设置队列长度为 k 。
Front: 从队首获取元素。如果队列为空,返回 -1 。
Rear: 获取队尾元素。如果队列为空,返回 -1 。
enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
isEmpty(): 检查循环队列是否为空。
isFull(): 检查循环队列是否已满。
示例:
MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1); // 返回 true
circularQueue.enQueue(2); // 返回 true
circularQueue.enQueue(3); // 返回 true
circularQueue.enQueue(4); // 返回 false,队列已满
circularQueue.Rear(); // 返回 3
circularQueue.isFull(); // 返回 true
circularQueue.deQueue(); // 返回 true
circularQueue.enQueue(4); // 返回 true
circularQueue.Rear(); // 返回 4
2.解题思路与代码
2.1 解题思路
这道题就是需要写一个双端队列,并且按照题目要求需要提供六个对外的方法,分别是获取头元素(Front)、获取尾元素(Rear)、入队(enQueue)、出队(deQueue)、对列是否为空(isEmpty)、对列是否已满(isFull)。既然是双端对列首先就会考虑到需要头尾两个变量来指向队列的队头和队尾,那么在初始化的时候就会使用 head 和 rear 两个变量,如果使用这两个变量指向头尾的话会让整个代码变得复杂,而且很容易把自己绕晕,比如在计算队列大小的时候。
我们可以看到队尾变量其实只有在入队和获取队尾元素的时候才会使用到,那么我们就可以不需要使用队尾变量,而是使用一个 size 变量来记录当前队列的大小,如果需要队尾的时候就使用 head 的位置加上队列长度 size 来确定队尾的位置。确定队尾位置就会出现两种情况:head+size 小于初始队列长度和 head+size 大于等于队列长度,处理方式如下:
- head+size 小于初始队列长度:此时直接队尾就是 head+size
- head+size 大于等于队列长度:此时队尾位置超出数组长度,那么队尾的位置就需要回到数组第一位开始往下数,即( head+size)% queue.length
通过上面的设定,题目规定需要实现的及方法就变得非常简单了:
- 获取头元素(Front):直接返回 head 位置元素
- 获取尾元素(Rear):根据上面提到的获取队尾元素位置的方法,返回即可
- 入队(enQueue):同样先获取到队尾位置,然后在队尾位置上插入新的元素
- 出队(deQueue):直接让 head 加一向后移动一位,此时队头就从新的位置开始,原来位置上的元素不动,入队时直接覆盖即可。需要注意如果 head 自增后等于数组长度,那么就需要回到头,从 0 位置开始
- 对列是否为空(isEmpty):因为我们维护了一个 size 变量记录队列中的元素,因此直接返回 size 是否为 0 就可以了不再需要复杂的计算
- 对列是否已满(isFull):同理判断 size 是否等于数组长度即可
2.2 代码
class MyCircularQueue {
int[] queue;
int head;
int size;
public MyCircularQueue(int k) {
queue = new int[k];
head = 0;
size = 0;
}
public boolean enQueue(int value) {
if (isFull()) {
return false;
}
int rear = head + size;
int index = rear >= queue.length ? rear % queue.length : rear;
queue[index] = value;
size++;
return true;
}
public boolean deQueue() {
if (isEmpty()) {
return false;
}
head = head + 1 == queue.length ? 0 : head + 1;
size--;
return true;
}
public int Front() {
if (isEmpty()) {
return -1;
}
return queue[head];
}
public int Rear() {
if (isEmpty()) {
return -1;
}
int rear = head + size;
int index = rear > queue.length ? rear % queue.length : rear;
return queue[index - 1];
}
public boolean isEmpty() {
return size == 0;
}
public boolean isFull() {
return size == queue.length;
}
}
2.3 测试结果
通过测试
3.总结
- 维护 size 变量记录队列长度可以简化很多代码
- 注意队尾和队头的边界
边栏推荐
- ArcEngine (2) loading the map document
- Dapr 与 NestJs ,实战编写一个 Pub & Sub 装饰器
- 【Kaggle实战】泰坦尼克号生存人数预测(从零到提交到Kaggle再到模型的保存与恢复)
- Taro框架-微信小程序-调用微信支付
- JS函数获取本月的第一天和最后一天
- 2022下半年软考「高项&集成」复习计划ta来喽~
- uni-app 顶部选项卡吸附效果 demo(整理)
- The use of the database table structure document generation tool screw
- 002-字段不为null
- @Async注解的坑,小心
猜你喜欢
sqlite 日期字段加一天
Evaluate: A detailed introduction to the introduction of huggingface evaluation indicator module
sqlserver2019安装失败
训练正常&异常的GAN损失函数loss变化应该是怎么样的
FusionAccess软件架构、FusionAccess必须配置的四个组件、桌面发放流程、虚拟机组类型、桌面组类型
redis AOF持久化个人理解
DSP Trick:向量长度估算
"Swordsman Offer" brush questions print from 1 to the largest n digits
“碳中和”愿景下,什么样的数据中心才是我们需要的?
进程的创建
随机推荐
《剑指Offer》刷题之打印从1到最大的n位数
DSP-ADAU1452输出通道配置
Redis分布式锁
服务器资源监控工具-nmon、nmon_analyser
MySQL or使索引失效
JS函数获取本月的第一天和最后一天
PowerShell:执行 Install-Module 时,不能从 URI 下载
HCIP实验(06)
VR全景市场拓展技巧之“拓客宝典”
实时目标检测新高地之#YOLOv7#更快更强的目标检测器
用diskpart的offline命令弹出顽固硬盘
Shell运维开发基础(一)
ArcEngine (4) Use of MapControl_OnMouseDown
如何让背景色在任何设备宽高都能填充整个屏幕
并发之固定运行和交替运行方案
vs 2022无法安装 vc_runtimeMinmum_x86错误
数据监控平台
netstat 及 ifconfig 是如何工作的。
timestamp
sqlite 日期字段加一天