问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4132 访问。

设计实现双端队列。

你的实现需要支持以下操作:

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();                    // 返回  32 -此处应为2,LeetCode官方翻译错误,2018-11-08

circularDeque.isFull();                         // 返回 true

circularDeque.deleteLast();                // 返回 true

circularDeque.insertFront(4);            // 返回 true

circularDeque.getFront();                   // 返回 4

提示:

  • 所有值的范围为 [1, 1000]
  • 操作次数的范围为 [1, 1000]
  • 请不要使用内置的双端队列库。

Design your implementation of the circular double-ended queue (deque).

Your implementation should support following operations:

MyCircularDeque(k): Constructor, set the size of the deque to be k.

insertFront(): Adds an item at the front of Deque. Return true if the operation is successful.

insertLast(): Adds an item at the rear of Deque. Return true if the operation is successful.

deleteFront(): Deletes an item from the front of Deque. Return true if the operation is successful.

deleteLast(): Deletes an item from the rear of Deque. Return true if the operation is successful.

getFront(): Gets the front item from the Deque. If the deque is empty, return -1.

getRear(): Gets the last item from Deque. If the deque is empty, return -1.

isEmpty(): Checks whether Deque is empty or not. 

isFull(): Checks whether Deque is full or not.

MyCircularDeque circularDeque = new MycircularDeque(3);    // set the size to be 3

circularDeque.insertLast(1);               // return true

circularDeque.insertLast(2);              // return true

circularDeque.insertFront(3);            // return true

circularDeque.insertFront(4);            // return false, the queue is full

circularDeque.getRear();                    // return 32 -此处应为2,LeetCode官方翻译错误,2018-11-08

circularDeque.isFull();                        // return true

circularDeque.deleteLast();               // return true

circularDeque.insertFront(4);            // return true

circularDeque.getFront();                  // return 4

Note:

  • All values will be in the range of [1, 1000].
  • The number of operations will be in the range of [1, 1000].
  • Please do not use the built-in Deque library.

示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4132 访问。

public class Program {

    public static void Main(string[] args) {
var circularDeque = new MyCircularDeque(5); Console.WriteLine(circularDeque.InsertFront(7));
Console.WriteLine(circularDeque.InsertLast(0));
Console.WriteLine(circularDeque.InsertLast(3));
Console.WriteLine(circularDeque.InsertFront(9)); Console.WriteLine(circularDeque.DeleteLast());
Console.WriteLine(circularDeque.GetRear()); Console.WriteLine(); var circularDeque2 = new MyCircularDeque2(5); Console.WriteLine(circularDeque2.InsertFront(1));
Console.WriteLine(circularDeque2.InsertLast(2)); Console.WriteLine(circularDeque2.InsertLast(3)); Console.WriteLine(circularDeque2.InsertFront(4)); Console.WriteLine(circularDeque2.GetRear());
Console.WriteLine(circularDeque2.IsFull());
Console.WriteLine(circularDeque2.DeleteLast());
Console.WriteLine(circularDeque2.GetRear()); Console.WriteLine(circularDeque2.InsertFront(4));
Console.WriteLine(circularDeque2.GetFront()); Console.ReadKey();
} public class MyCircularDeque { private int _frontIndex = -1;
private int _rearIndex = -1; private int _count = 0; private List<int> _frontList = null;
private List<int> _rearList = null; public MyCircularDeque(int k) {
//构造函数,双端队列的大小为k
_count = k;
_frontList = new List<int>();
_rearList = new List<int>();
} public bool InsertFront(int value) {
//将一个元素添加到双端队列头部。 如果操作成功返回 true
if(_count == 0 || _frontIndex + _rearIndex == _count - 2) return false;
_frontIndex++;
_frontList.Add(value);
return true;
} public bool InsertLast(int value) {
//将一个元素添加到双端队列尾部。如果操作成功返回 true
if(_count == 0 || _frontIndex + _rearIndex == _count - 2) return false;
_rearIndex++;
_rearList.Insert(0, value);
return true;
} public bool DeleteFront() {
//从双端队列头部删除一个元素。 如果操作成功返回 true
if(_count == 0 || _frontIndex + _rearIndex == -2) return false;
if(_frontIndex == -1) {
_rearList.RemoveAt(_rearIndex);
_rearIndex--;
return true;
}
_frontList.RemoveAt(_frontIndex);
_frontIndex--;
return true;
} public bool DeleteLast() {
//从双端队列尾部删除一个元素。如果操作成功返回 true
if(_count == 0 || _frontIndex + _rearIndex == -2) return false;
if(_rearIndex == -1) {
_frontIndex--;
_frontList.RemoveAt(0);
return true;
}
_rearIndex--;
_rearList.RemoveAt(0);
return true;
} public int GetFront() {
//从双端队列头部获得一个元素。如果双端队列为空,返回 -1
if(_count == 0 || _frontIndex + _rearIndex == -2) return -1;
if(_frontIndex == -1) {
return _rearList[_rearIndex];
}
return _frontList[_frontIndex];
} public int GetRear() {
//获得双端队列的最后一个元素。 如果双端队列为空,返回 -1
if(_count == 0 || _frontIndex + _rearIndex == -2) return -1;
if(_rearIndex == -1) {
return _frontList[0];
}
return _rearList[0];
} public bool IsEmpty() {
//检查双端队列是否为空
return _frontIndex + _rearIndex == -2;
} public bool IsFull() {
//检查双端队列是否满了
return _frontIndex + _rearIndex == _count - 2;
} } public class MyCircularDeque2 { private List<int> _list = null;
private int _count = 0; public MyCircularDeque2(int k) {
_list = new List<int>();
_count = k;
} public bool InsertFront(int value) {
if(_count > _list.Count) {
_list.Insert(0, value);
return true;
}
return false;
} public bool InsertLast(int value) {
if(_count > _list.Count) {
_list.Add(value);
return true;
}
return false;
} public bool DeleteFront() {
if(_list.Count > 0) {
_list.RemoveAt(0);
return true;
}
return false;
} public bool DeleteLast() {
if(_list.Count > 0) {
_list.RemoveAt(_list.Count - 1);
return true;
}
return false;
} public int GetFront() {
return _list.Count > 0 ? _list[0] : -1;
} public int GetRear() {
return _list.Count > 0 ? _list[_list.Count - 1] : -1;
} public bool IsEmpty() {
return _list.Count <= 0;
} public bool IsFull() {
return _list.Count == _count;
} } }

以上给出2种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4132 访问。

True
True
True
True
True
0 True
True
True
True
3
False
True
2
True
4

分析:

显而易见,以上2种算法中所有的方法的时间复杂度均为:  。

C#LeetCode刷题之#641-设计循环双端队列(Design Circular Deque)的更多相关文章

  1. [Swift]LeetCode641. 设计循环双端队列 | Design Circular Deque

    Design your implementation of the circular double-ended queue (deque). Your implementation should su ...

  2. Java实现 LeetCode 641 设计循环双端队列(暴力)

    641. 设计循环双端队列 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头 ...

  3. Leetcode641.Design Circular Deque设计循环双端队列

    设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头部. 如果操作成功返回 tr ...

  4. C#LeetCode刷题之#622-设计循环队列​​​​​​​(Design Circular Queue)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4126 访问. 设计你的循环队列实现. 循环队列是一种线性数据结构 ...

  5. C#LeetCode刷题之#706-设计哈希映射(Design HashMap)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4116 访问. 不使用任何内建的哈希表库设计一个哈希映射 具体地说 ...

  6. C#LeetCode刷题之#705-设计哈希集合​​​​​​​(Design HashSet)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4114 访问. 不使用任何内建的哈希表库设计一个哈希集合 具体地说 ...

  7. java数据结构-11循环双端队列

    @SuppressWarnings("unchecked") public class CircleDeque<E> { private int front; priv ...

  8. C#LeetCode刷题-设计

    设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制   33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索 ...

  9. C#LeetCode刷题-队列

    队列篇 # 题名 刷题 通过率 难度 363 矩形区域不超过 K 的最大数值和   27.2% 困难 621 任务调度器   40.9% 中等 622 设计循环队列 C#LeetCode刷题之#622 ...

随机推荐

  1. 为啥Underlay才是容器网络的最佳落地选择

    导语: 几年前,当博云启动自研容器网络研发的时候,除了技术选型的考虑,我们对于先做 Underlay 还是 Overlay 网络也有过深度的讨论.当时的开源社区以及主流容器厂商,多数还是以 Overl ...

  2. tineMCE 踩坑:images_upload_handler

    tineMCE 的官方示例提供了前端上传图片方法 images_upload_handler 的写法. 但官方写的有点问题,上传会报错. 不过修改也很简单: images_upload_handler ...

  3. springboot+junit测试

    文章目录 一.junit断言 二.测试模块 三.使用Mockito作为桩模块 四.使用mockMvc测试web层 五.批量测试和测试覆盖率 参考视频:用Spring Boot编写RESTful API ...

  4. Python "按位或"和"按位异或"的区别

    首先分别解释一下按位或和按位异或 按位或: 按位或指的是参与运算的两个数分别对应的二进制位进行“或”的操作.只要对应的两个二进制位有一个为1时,结果位就为1.python中运算符为“|” 按位异或: ...

  5. 看了这篇你就会手写RPC框架了

    一.学习本文你能学到什么? RPC的概念及运作流程 RPC协议及RPC框架的概念 Netty的基本使用 Java序列化及反序列化技术 Zookeeper的基本使用(注册中心) 自定义注解实现特殊业务逻 ...

  6. 随机生成姓名&批量生成不重名

    # -*- coding: utf-8 -*- """ Created on Thu Jul 23 14:43:07 2020 @author: Administrato ...

  7. File类的基本概念与递归

    一.File类 1.概念 File类:是文件和目录路径名的抽象表示形式. 即,Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这 ...

  8. Apache Tomcat/8.5.51 secretRequired="true"

    1.报错IllegalArgumentException: The AJP Connector is configured with secretRequired="true" b ...

  9. 花生壳内网穿透vue项目错误

    原因:新版的webpack-dev-server出于安全考虑,默认检查hostname,如果hostname不是配置内的,将中断访问. 解决:webpack.dev.conf.js添加配置 disab ...

  10. Mybatis-Plus中Wrapper的方法

    public interface EntityService extends IService<TbEntity>{ }entityService.update(entity,Condit ...