问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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. vscode安装rainbow-fart(彩虹屁)插件,程序员只能自我鼓励了!!!

    2020-7-10更新 Rainbow Fart 插件现以发布到 VSCode 商店,安装过 VSIX 版本的用户请卸载之前的版本,从商店安装. 从 VSCode 扩展商店 下载并安装.(更新vsco ...

  2. 史上最全的 jmeter 获取 jdbc 数据使用的四种方法

    jmeter使用jdbc协议获取数据库中数据,很多人都会用,因为大家在做测试的时候,有时候需要大量的用户进行登录,获取需要数据库中真实的数据用于测试,所以常常会用jdbc来获取数据库数据. 那从数据库 ...

  3. Active Directory - Right Delegation and Audit

    Delegate proper right to some user:  Login/Logout Audit - GPO Setting - Event Viewer File Auditing M ...

  4. Active Directory - Server Remote administration management

    Windows Admin Center: https://www.microsoft.com/en-us/evalcenter/evaluate-windows-admin-center Remot ...

  5. Python数据分析——numpy基础简介

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:基因学苑 NumPy(Numerical Python的简称)是高性 ...

  6. java基础知识--环境变量配置

    说到java,大家应该都了解:J2SE基础.J2ME嵌入式.J2EE延伸的内容,而我们平时接触和所谈大部分都是J2EE企业级应用开发. 作为开发者,使用java之前,必须安装java开发环境,配置ja ...

  7. [jvm] -- 垃圾收集器篇

    垃圾收集器 Serial 收集器 单线程收集器,不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The ...

  8. java8之Stream流处理

    简介 Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念. Stream 机制是针对集合迭代器 ...

  9. CODING DevOps + Nginx-ingress 实现自动化灰度发布

    作者:王炜,CODING DevOps 后端开发工程师,拥有多年研发经验,云原生.DevOps.Kubernetes 资深爱好者,Servicemesher 服务网格中文社区成员.获得 Kuberne ...

  10. javascript 通信协议

    简介 javascript 通信协议是一个伪协议[1], 用于指定 URL 为 JavaScript 代码 语法: javascript:someScript; someScript 是一个或多个使用 ...