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 <= k <= 1000
- 0 <= value <= 1000
- insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull 调用次数不大于 2000 次
解题分析及思路:
本题与622、设计循环队列类似,只不过这不是循环的队列,而是双向队列,不过可以采用同样的方法。
定义队列结构,nums
保存所有的元素,firstIndex
为队列的队头位置,num
代表队列元素的个数。
type MyCircularDeque struct {
nums []int
firstIndex int
num int
}
func Constructor(k int) MyCircularDeque {
return MyCircularDeque{
make([]int, k),
0, 0,
}
}
- IsEmpty:判断num是否为零
- IsFull:判断num是否与数组长度相等
- InsertFront:在队头
(this.firstIndex + len(this.nums) - 1) % len(this.nums)
插入一个元素,长度加一 - InsertLast:在队尾插
(this.firstIndex + this.num) % len(this.nums)
入一个元素,长度加一 - DeleteFront:将队头往后移一位
- DeleteLast: 将长度减一
- GetFront:输出队头位置的元素
this.nums[this.firstIndex]
- GetRear: 输出队尾位置的元素
this.nums[(this.firstIndex+this.num-1)%len(this.nums)]
注意不要越界即可。
func (this *MyCircularDeque) InsertFront(value int) bool {
if this.IsFull() {
return false
}
this.firstIndex = (this.firstIndex + len(this.nums) - 1) % len(this.nums)
this.nums[this.firstIndex] = value
this.num++
return true
}
func (this *MyCircularDeque) InsertLast(value int) bool {
if this.IsFull() {
return false
}
index := (this.firstIndex + this.num) % len(this.nums)
this.nums[index] = value
this.num++
return true
}
func (this *MyCircularDeque) DeleteFront() bool {
if this.IsEmpty() {
return false
}
this.firstIndex = (this.firstIndex + 1) % len(this.nums)
this.num--
return true
}
func (this *MyCircularDeque) DeleteLast() bool {
if this.IsEmpty() {
return false
}
this.num--
return true
}
func (this *MyCircularDeque) GetFront() int {
if this.IsEmpty() {
return -1
}
return this.nums[this.firstIndex]
}
func (this *MyCircularDeque) GetRear() int {
if this.IsEmpty() {
return -1
}
return this.nums[(this.firstIndex+this.num-1)%len(this.nums)]
}
func (this *MyCircularDeque) IsEmpty() bool {
return this.num == 0
}
func (this *MyCircularDeque) IsFull() bool {
return this.num == len(this.nums)
}
复杂度:
- 时间复杂度:O(1)
- 空间复杂度:O(k)
执行结果:
- 执行用时:12 ms, 在所有 Go 提交中击败了86.83%的用户
- 内存消耗:6.6 MB, 在所有 Go 提交中击败了99.40%的用户
Tags :
通过次数 69.6K 提交次数 122.9K 通过率 56.6%