问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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. 深入浅出ReentrantLock源码解析

    ReentrantLock不但是可重入锁,而且还是公平或非公平锁,在工作中会经常使用到,将自己对这两种锁的理解记录下来,希望对大家有帮助. 前提条件 在理解ReentrantLock时需要具备一些基本 ...

  2. python 复制以及更改列表操作

    题目:设置一个老用户列表和一个新用户列表,检查老用户列表中是否与新注册的用户名字有重复(不区分大小写),老用户列表不能被破坏 usernames = ['admin','Tom','john','ja ...

  3. 【翻译】Scriban README 文本模板语言和.NET引擎

    scriban Scriban是一种快速.强大.安全和轻量级的文本模板语言和.NET引擎,具有解析liquid模板的兼容模式 Github https://github.com/lunet-io/sc ...

  4. C++语法小记---抽象类和接口

    抽象类和接口 C++中没有抽象类的概念 含有纯虚函数的类就是抽象类,抽象类的特点: 不能产生实例对象 只能被继承 接口是抽象类的一种特殊情况,具备以下条件的抽象类就是接口: 类中没有成员变量 所有的成 ...

  5. 常用CSS颜色表

    1.16进制的CSS颜色代码 > http://www.jsjtt.com/webkaifa/HTML/65.html

  6. React Native 控制一个component的显示隐藏

      // 首先在constructor里:   this.state = { visible: false }   // 然后在点击事件设置:   this.setState({ visible: t ...

  7. Kafka 入门(二)--数据日志、副本机制和消费策略

    一.Kafka 数据日志 1.主题 Topic Topic 是逻辑概念. 主题类似于分类,也可以理解为一个消息的集合.每一条发送到 Kafka 的消息都会带上一个主题信息,表明属于哪个主题. Kafk ...

  8. [转载]android网络通信解析

    原文地址:android网络通信解析作者:clunyes 网络编程的目的就是直接戒间接地通过网络协议不其他计算机进行通讯. 网络编程中有两个主要的问题, 一个是如何准确的定位网络上一台戒多台指主机: ...

  9. Bug--slfj4依赖冲突

    SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/F:/Spring%20p ...

  10. Java 构造方法及关键字:this、super、final、static

    一.构造方法 1.概念 在创建对象时,需要明确对象的属性值,即当使用new关键字创建对象时,同时给对象的属性初始化值. 这就需要用到构造方法.构造方法的格式: 修饰符 构造方法名(参数列表){ } 构 ...