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,一经查实,立即删除!

相关文章

js 中声明变量 “提前”

1.变量定义提升:声明语句:(1)var声明语句:变量声明语句会被“提前”至脚本或者函数的顶部,但是初始化的操作则还在原来var语句的位置执行。例如,下面的例子,所示:function fun(){alert(x);var x666;alert(x…

运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(二)

现在开始介绍phpmysqlshell监控系统 1、目的此监控系统主要是通过phpmysqlshell的方式,通过shell脚本对各个机器的其各个服务进行监控,达到及时的了解其各个应用服务的状态(如果宕掉与启动),在检测应用服务宕掉时&…

Android之事件总线EventBus详解

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

湘乡江南计算机学校,湘乡职业中等专业学校2021年招生录取分数线

许多学生对自己的职业生涯并没有什么明确的规划,所以没有什么好结果,纯属正常现象。只要不断学习,才能不断收获。由此,本网老师为大家整理了湘乡职业中等专业学校2021年招生录取分数线的相关内容,后期若有变化,一切以官方发布为准。湘乡职业中等专业学校往年参考分数线年份地区…

实验4

#include<stdio.h> int main(void) {double r,h,v,n;printf("Enter r,h and n ");scanf("%lf%lf%lf",&r,&h,&n);if(r<0||h<0){printf("输入错误&#xff0c;重新输入");}else{vcylinder(r,h,n);printf("v%.3f\n&qu…

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

1 大象为什么会害怕体型小的动物&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 学会说话很重要&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 原来&#xff0c;他们的老爸是一串香肠&#xff1f;&#xff08;素材来源网络&#xff0c;侵…

WPF开源项目:WPF-ControlBase

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

Win10系统修改MAC地址

本地管理地址&#xff0c;输入想修改的MAC地址后&#xff0c;点确定即完成修改。在CMD窗口中&#xff0c;使用ipconfig 命令可以查看新的MAC地址。 再次钩选不存在&#xff0c;则还原为原来的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…

Android之安全退出应用程序的几种方式

当我们做项目的时候,当用户在几秒的时间之内按回车键的时候,需要退出程序,但是退出我们要确保安全退出,防止还有程序还在后台运行,下面介绍几种安全的退出程的几种方式(综合了其它博客的然后加上自己使用的看到的总结) number1: 首先获取当前进程的id,然后杀死该进程。…

西电计算机应用基础 一,15秋西电《计算机应用基础(一)》在线作业答案解析.doc...

西电《计算机应用基础(一)》在线作业一、单选题(共 25 道试题&#xff0c;共 100 分。)1. 下拉式菜单命令项右侧的三角形标记说明&#xff1a;. 该命令项当前正在起作用。. 选择该命令将弹出一个对话框。. 该命令项是级联式命令。. 该命令项无快捷键组合。正确答案&#xff1a;…

SBuild 0.1.4 发布,基于 Scala 的构建系统

SBuild 0.1.4 改进了 Eclipse 插件的稳定性&#xff1b;ZipSchemeHandler的 TargetFile 参数相对于项目目录&#xff1b;一些 Ant 的封装提供更多支持的参数。 SBuild 是基于 Scala 的构建系统&#xff0c;主要特点&#xff1a; 平台无关支持多项目自动检测所需的动作以及新版本…

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

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

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

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

C# WPF MVVM开发框架Caliburn.Micro常用功能指南②

这是Caliburn.Micro项目中最常用的约定和功能的快速指南。01—事件连接这会自动将控件上的事件关联到ViewModel上的方法。常规约定&#xff1a;<Button x:Name"Save">这将导致按钮的单击事件调用ViewModel上的“Save”方法。简短语法&#xff1a;<Button ca…

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…

栈和队列之用一个栈实现另一个栈的排序

用一个栈实现另一个栈的排序 题目: 一个栈元素的类型为整数,现在要想将该栈从顶到底按从大到小的顺序排列,只允许申请一个栈,除此之外, 可以申请一个变量,可以申请额外的变量,但是不能申请额外的数据结构,如何完成排序 思路: 我们需要排序的栈为stack,然后我们申请…