sv队列和动态数组的区别_Go 刷 LeetCode 系列:经典(7) 设计双端队列

设计实现双端队列。

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

MyCircularDeque(k):构造函数,双端队列的大小为k。insertFront():将一个元素添加到双端队列头部。如果操作成功返回 true。insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。deleteFront():从双端队列头部删除一个元素。如果操作成功返回 true。deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。getRear():获得双端队列的最后一个元素。如果双端队列为空,返回 -1。isEmpty():检查双端队列是否为空。isFull():检查双端队列是否满了。示例:MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3circularDeque.insertLast(1);              // 返回 truecircularDeque.insertLast(2);              // 返回 truecircularDeque.insertFront(3);              // 返回 truecircularDeque.insertFront(4);              // 已经满了,返回 falsecircularDeque.getRear();          // 返回 2circularDeque.isFull();                // 返回 truecircularDeque.deleteLast();              // 返回 truecircularDeque.insertFront(4);              // 返回 truecircularDeque.getFront();        // 返回 4

提示:

所有值的范围为 [1, 1000]

操作次数的范围为 [1, 1000]

请不要使用内置的双端队列库。

解题思路

1、定义循环变量 front 和 rear 。一直保持这个定义,到底是先赋值还是先移动指针就很容易想清楚了。

front:指向队列头部第 1 个有效数据的位置;

rear:指向队列尾部(即最后 1 个有效数据)的下一个位置,即下一个从队尾入队元素的位置。

(说明:这个定义是依据“动态数组”的定义模仿而来。)

2、为了避免“队列为空”和“队列为满”的判别条件冲突,我们有意浪费了一个位置。

浪费一个位置是指:循环数组中任何时刻一定至少有一个位置不存放有效元素。

判别队列为空的条件是:front == rear;

判别队列为满的条件是:(rear + 1) % capacity == front;。可以这样理解,当 rear 循环到数组的前面,要从后面追上 front,还差一格的时候,判定队列为满。

3、因为有循环的出现,要特别注意处理数组下标可能越界的情况。

(1)指针后移的时候,索引 + 1,要取模;

(2)指针前移的时候,为了循环到数组的末尾,需要先加上数组的长度,然后再对数组长度取模。

4,如果队列为空

插入元素的时候要注意,

(1)头部插入,rear 后移

 (2)尾部插入,rear后移

代码实现

type MyCircularDeque struct {    length int    data []int    head int    rear int}/** Initialize your data structure here. Set the size of the deque to be k. */func Constructor(k int) MyCircularDeque {    return MyCircularDeque{        length:k+1,        data:make([]int,k+1), //空一个位置区分满和空        head:0,        rear:0,    }}/** Adds an item at the front of Deque. Return true if the operation is successful. */func (this *MyCircularDeque) InsertFront(value int) bool {    if this.IsFull(){       return false   }   if this.IsEmpty(){       if this.rear==this.length-1{           this.rear=0       }else{           this.rear++       }       this.data[this.head]=value       return true   }      if this.head==0{       this.head=this.length-1   }else{       this.head--   }    this.data[this.head]=value   return true}/** Adds an item at the rear of Deque. Return true if the operation is successful. */func (this *MyCircularDeque) InsertLast(value int) bool {  if this.IsFull(){      return false  }  if this.IsEmpty(){      this.data[this.rear]=value     if this.rear==this.length-1{          this.rear=0     }else{         this.rear++     }     return true  }    this.data[this.rear]=value  if this.rear==this.length-1{      this.rear=0  }else{      this.rear++  }  return true}/** Deletes an item from the front of Deque. Return true if the operation is successful. */func (this *MyCircularDeque) DeleteFront() bool {  if this.IsEmpty(){      return false  }  if this.head==this.length-1{      this.head=0  }else{      this.head++  }  return true}/** Deletes an item from the rear of Deque. Return true if the operation is successful. */func (this *MyCircularDeque) DeleteLast() bool {    if this.IsEmpty(){        return false    }    if this.rear==0{        this.rear=this.length-1    }else{        this.rear--    }    return true}/** Get the front item from the deque. */func (this *MyCircularDeque) GetFront() int {        if this.IsEmpty(){            return -1        }        return this.data[this.head]  }/** Get the last item from the deque. */func (this *MyCircularDeque) GetRear() int {        if this.IsEmpty(){            return -1        }        if this.rear==0{            return this.data[this.length-1]        }      return this.data[this.rear-1]}/** Checks whether the circular deque is empty or not. */func (this *MyCircularDeque) IsEmpty() bool {    return this.head==this.rear}/** Checks whether the circular deque is full or not. */func (this *MyCircularDeque) IsFull() bool {    return (this.rear+1)%this.length==this.head}/** * Your MyCircularDeque object will be instantiated and called as such: * obj := Constructor(k); * param_1 := obj.InsertFront(value); * param_2 := obj.InsertLast(value); * param_3 := obj.DeleteFront(); * param_4 := obj.DeleteLast(); * param_5 := obj.GetFront(); * param_6 := obj.GetRear(); * param_7 := obj.IsEmpty(); * param_8 := obj.IsFull(); */

推荐阅读

  • Go 刷 LeetCode 系列:经典(6) 实现跳表


喜欢本文的朋友,欢迎关注“Go语言中文网”:

5f4191457a4d42679ebe666543db44dd.png

Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之事件总线EventBus详解

顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码更加简洁,耦合性更低,提升了我们的代码质量…

当女朋友问你会不会出轨的时候,该怎么回答?

1 大象为什么会害怕体型小的动物?(素材来源网络,侵删)▼2 学会说话很重要(素材来源网络,侵删)▼3 原来,他们的老爸是一串香肠?(素材来源网络,侵…

WPF开源项目:WPF-ControlBase

仓库截图仓库README很素,但看作者README贴的几篇博文介绍,你会喜欢上它的,废话不多说,上介绍目录:动画封装https://blog.csdn.net/u010975589/article/details/95974854属性表单https://blog.csdn.net/u010975589/arti…

Win10系统修改MAC地址

本地管理地址,输入想修改的MAC地址后,点确定即完成修改。在CMD窗口中,使用ipconfig 命令可以查看新的MAC地址。 再次钩选不存在,则还原为原来的MAC地址。

ftp上传图片出现550_FtpClient 实现文件上传

FtpUtils 工具类封装 public static boolean uploadFile( String hostname, int port, String username, String password, String pathname, String remote,InputStream local) { boolean flagfalse; try{ //创建 FtpClient 对象 FTPClient clientnew FTPClient…

ZOJ 3228(AC自动机+修改的匹配)

题目大意:给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 分析:可重叠出现的单词可以直接用ac自动机就解决。至于不可重叠的单词,可以用一个数…

一篇论文未发博士毕业,中科院最年轻院士入职浙大

全世界只有3.14 % 的人关注了爆炸吧知识本文由科研大匠(Id:keyandajiang)综合整理自科技日报、网络、科研大匠等11月30日,浙江大学官微转载《浙江日报》头版文章消息提到,“目前中国最年轻的中科院院士孙斌勇已入职数学高等研究院…

4.7、Bootstrap V4自学之路------组件---广告屏

为什么80%的码农都做不了架构师&#xff1f;>>> 示例 单独的一个空的标签 <div class"jumbotron"><!-- 背景色是灰色的--> <div> PS&#xff1a;可以看出来&#xff0c;其中上下边距还是挺高的。 <div class"jumbotron"&…

计算机和hdmi无法正常显示,HDMI都不灵 为什么电脑连电视效果差?

1电脑连接电视用法人群庞大【中关村在线显示器频道原创】目前的桌面级显示器尺寸最大的范围就是30英寸&#xff0c;但是30英寸的显示器产品价格过于昂贵&#xff0c;因此很少有消费者能够选择购买。因此&#xff0c;目前大部分消费者都会购买27英寸的显示器&#xff0c;但是问题…

easyui 修改单元格内容_初学Excel办公软件快速修改文字的方法

今天我们学习Excel办公软件快速修改文字的方法&#xff0c;首先我们看这个表格里面的文字很多都是相差一个字&#xff0c;甚至很多内容相差不大&#xff0c;因此我们在输入文字时就需要改进快速方法了。首先我们根据图片来操作&#xff0c;我们修改红色字体里的数据&#xff0c…

Android display架构分析

这篇文章非常好&#xff0c;必须转载。目录(?)[-] Kernel Space Display架构介绍函数和数据结构介绍函数和数据结构介绍函数和数据结构介绍数据流分析初始化过程分析User Space display接口Kernel display接口典型应用flow分析介绍 Surface manager&#xff08;surface flinge…

从状态转移看:载波侦听多路访问/冲突避免(CSMA/CA)

CSMA/CA是写入IEEE802.11的无线网络MAC层标准协议&#xff0c;相信看到这篇文章的读者都知道它是用来做什么的。但许多短文对这个协议的解释都有所缺乏&#xff0c;因此本文用状态转换图的形式详细说明协议的工作流程。&#xff08;好吧其实是作者看到一个状态图有感而发&#…

年度迷惑新闻:美女其实是个男生?

1 南方人为什么不喜欢冬天&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 老板果然是有两把刷子&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 干大事者必是单身狗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 把狗子的铁饭…

The import com.sun.tools cannot be resolved

2019独角兽企业重金招聘Python工程师标准>>> 这是因为在myeclipse中&#xff0c;有自带的jar包&#xff1b;儿导入eclipse中&#xff0c;用的是自己安装的jre&#xff0c;tool.jar包是在JDK中&#xff0c;不是在jre中,所以window-》preferrence-》java-》installed …

Android之发送短信后按钮(60秒)变灰色每隔一秒递减显示

无论是做PC端还是android端,每次注册都有发送短信之后,60秒每隔一秒递减显示,如下图 这个地方需要注意的是按钮变灰色之后不能再点击,然后就是android更新UI,需要用handle,或者其它post方式,关键代码如下 /*** 显示时间在梯减的文本框*/public void showTime() {new T…

AgileConfig-1.5.5 发布 - 支持 JSON 编辑模式

本次更新加入了2个新的编辑模式&#xff1a;JSON 编辑模式、TEXT 编辑模式。特别是 JSON 编辑模式是大家比较期待的一个功能。因为大家都习惯了 appsettings.json 的配置编辑模式&#xff0c;所以天生的喜欢 JSON 视图。有了 JSON 编辑模式后&#xff0c;大家就可以直接把原来的…

桩筏有限元中的弹性板计算_永清县打桩机租赁钢板桩租赁怎么联系?

永清县打桩机租赁钢板桩租赁怎么联系&#xff1f;选择专业(产品)震宇建筑工程有限公司震宇钢板桩工程有限公司是一家专业拉森钢板桩工程施工的公司&#xff0c;注册资金1000万&#xff0c;专注钢板桩工程施工20年年经验&#xff0c;经过多年发展&#xff0c;目前震宇钢板桩在广…

(c语言)二叉树中序线索(数据结构十七)

1.数据类型定义在代码中为了清楚的表示一些错误和函数运行状态&#xff0c;我们预先定义一些变量来表示这些状态。在head.h头文件中有如下定义&#xff1a; //定义数据结构中要用到的一些变量和类型 #ifndef HEAD_H #define HEAD_H#include <stdio.h> #include <mallo…

如果让我做一回产品经理。。。

2019独角兽企业重金招聘Python工程师标准>>> 不给外行老板打工&#xff0c;除非自己是合伙人 玩法、题材、货币化模式上&#xff0c;至少要有一个有创新 不做中国市场&#xff0c;至少不优先做 杜绝团队内部吵架 团队优于产品&#xff0c;即使对于创业公司也是这样 …

有文化能有多可怕?

全世界只有3.14 % 的人关注了爆炸吧知识知乎上有个高赞问题&#xff1a;有哪些值得长期坚持下去就能改变人生的好习惯&#xff1f;其中最高频的回答是读书。随着经历和阅历的增加&#xff0c;越来越多的人清醒的认识到&#xff1a;读书不再是学生时代的事&#xff0c;而是一生的…