「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
题目:
641. 设计循环双端队列
设计实现双端队列。
你的实现需要支持以下操作:
- MyCircularDeque(k):构造函数,双端队列的大小为k。
- insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
- insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
- deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
- deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
- getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
- getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
- isEmpty():检查双端队列是否为空。
- isFull():检查双端队列是否满了。
示例:
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, 1000]
- 操作次数的范围为 [1, 1000]
- 请不要使用内置的双端队列库。
思路
首先这道题和我上篇文章的题目非常类似,建议你们阅读完上一篇文章接着看这篇,做成一个系列。# [路飞]_一起刷leetcode 622. 设计循环队列
- 这道题目我们只需要在原本普通循环队列的基础上,新增一个队头插入和队尾删除的方法即可;
- 这道题目一共需要八个方法,我们先来拆解;
isert
队列头部和尾部,我们可以用Array.unshift
和Array.push
去实现,不过在插入前需要判断队列是否已经满了;delete
队列头部和尾部,我们可以用Array.shift
和Array.pop
去实现,不过在删除前需要判断队列是否为空;- 返回第一个元素和最后一个元素我们直接通过数组的索引去返回即可,不过需要判断数组是否为空;
- 判断队列是否已满和是否为空我们直接通过数组的长度判断即可。
实现
/**
* @param {number} k
*/
var MyCircularDeque = function(k) {
this.list = [];
this.maxCount = k;
};
/**
* @param {number} value
* @return {boolean}
*/
MyCircularDeque.prototype.insertFront = function(value) {
if (this.list.length < this.maxCount) {
this.list.unshift(value);
return true;
}
return false;
};
/**
* @param {number} value
* @return {boolean}
*/
MyCircularDeque.prototype.insertLast = function(value) {
if (this.list.length < this.maxCount) {
this.list.push(value);
return true;
}
return false;
};
/**
* @return {boolean}
*/
MyCircularDeque.prototype.deleteFront = function() {
if (this.list.length > 0) {
this.list.shift();
return true;
}
return false;
};
/**
* @return {boolean}
*/
MyCircularDeque.prototype.deleteLast = function() {
if (this.list.length > 0) {
this.list.pop();
return true;
}
return false;
};
/**
* @return {number}
*/
MyCircularDeque.prototype.getFront = function() {
return this.list.length ? this.list[0] : -1;
};
/**
* @return {number}
*/
MyCircularDeque.prototype.getRear = function() {
return this.list.length ? this.list[this.list.length - 1] : -1;
};
/**
* @return {boolean}
*/
MyCircularDeque.prototype.isEmpty = function() {
return this.list.length === 0;
};
/**
* @return {boolean}
*/
MyCircularDeque.prototype.isFull = function() {
return this.list.length === this.maxCount;
};
/**
* Your MyCircularDeque object will be instantiated and called as such:
* var obj = new MyCircularDeque(k)
* var param_1 = obj.insertFront(value)
* var param_2 = obj.insertLast(value)
* var param_3 = obj.deleteFront()
* var param_4 = obj.deleteLast()
* var param_5 = obj.getFront()
* var param_6 = obj.getRear()
* var param_7 = obj.isEmpty()
* var param_8 = obj.isFull()
*/
复制代码
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。