数据结构与算法之栈: LeetCode 641. 设计循环双端队列 (Ts版)

设计循环双端队列

  • https://leetcode.cn/problems/design-circular-deque/description/

描述

  • 设计实现双端队列。

  • 实现 MyCircularDeque 类:

    • MyCircularDeque(int k) :构造函数,双端队列最大为 k 。
    • boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。
    • boolean insertLast() :将一个元素添加到双端队列尾部。如果操作成功返回 true ,否则返回 false 。
    • boolean deleteFront() :从双端队列头部删除一个元素。 如果操作成功返回 true ,否则返回 false 。
    • boolean deleteLast() :从双端队列尾部删除一个元素。如果操作成功返回 true ,否则返回 false 。
    • int getFront() ):从双端队列头部获得一个元素。如果双端队列为空,返回 -1 。
    • int getRear() :获得双端队列的最后一个元素。 如果双端队列为空,返回 -1 。
    • boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false 。
    • boolean isFull() :若双端队列满了,则返回 true ,否则返回 false 。

示例 1:

输入
["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
[[3], [1], [2], [3], [4], [], [], [], [4], []]
输出
[null, true, true, true, false, 2, true, true, true, 4]

解释

MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
circularDeque.insertLast(1);			        // 返回 true
circularDeque.insertLast(2);			        // 返回 true
circularDeque.insertFront(3);			        // 返回 true
circularDeque.insertFront(4);			        // 已经满了,返回 false
circularDeque.getRear();  				// 返回 2
circularDeque.isFull();				        // 返回 true
circularDeque.deleteLast();			        // 返回 true
circularDeque.insertFront(4);			        // 返回 true
circularDeque.getFront();				// 返回 4

提示:

  • 1 <= k <= 1000
  • 0 <= value <= 1000
  • insertFront, insertLast, deleteFront, deleteLast, getFront, getRear, isEmpty, isFull 调用次数不大于 2000 次

Typescript 版算法实现


1 ) 方案1:数组

class MyCircularDeque {private capacity: number;private rear: number;private front: number;private elements: number[];constructor(k: number) {this.capacity = k + 1; // 使用 k+1 来区分满和空的情况this.rear = 0;this.front = 0;this.elements = new Array<number>(this.capacity).fill(0);}insertFront(value: number): boolean {if (this.isFull()) {return false;}this.front = (this.front - 1 + this.capacity) % this.capacity;this.elements[this.front] = value;return true;}insertLast(value: number): boolean {if (this.isFull()) {return false;}this.elements[this.rear] = value;this.rear = (this.rear + 1) % this.capacity;return true;}deleteFront(): boolean {if (this.isEmpty()) {return false;}this.front = (this.front + 1) % this.capacity;return true;}deleteLast(): boolean {if (this.isEmpty()) {return false;}this.rear = (this.rear - 1 + this.capacity) % this.capacity;return true;}getFront(): number {if (this.isEmpty()) {return -1;}return this.elements[this.front];}getRear(): number {if (this.isEmpty()) {return -1;}return this.elements[(this.rear - 1 + this.capacity) % this.capacity];}isEmpty(): boolean {return this.rear === this.front;}isFull(): boolean {return (this.rear + 1) % this.capacity === this.front;}
}/*** Your MyCircularDeque object will be instantiated and called as such:* var obj = new MyCircularDeque(k)* var param_1 = obj.insertFront(value)* var param_2 = obj.insertLast(value)* var param_3 = obj.deleteFront()* var param_4 = obj.deleteLast()* var param_5 = obj.getFront()* var param_6 = obj.getRear()* var param_7 = obj.isEmpty()* var param_8 = obj.isFull()*/

2 ) 方案2:链表

// 定义节点结构
class Node {prev: Node | null = null;next: Node | null = null;val: number;constructor(value: number) {this.val = value;}
}class MyCircularDeque {head: Node | null = null;tail: Node | null = null;capacity: number;size: number = 0;constructor(k: number) {this.capacity = k;}// 在队列前端插入元素insertFront(value: number): boolean {if (this.isFull()) {return false;}const newNode = new Node(value);if (this.isEmpty()) {this.head = newNode;this.tail = newNode;} else {newNode.next = this.head;if (this.head) {this.head.prev = newNode;}this.head = newNode;}this.size++;return true;}// 在队列末端插入元素insertLast(value: number): boolean {if (this.isFull()) {return false;}const newNode = new Node(value);if (this.isEmpty()) {this.head = newNode;this.tail = newNode;} else {if (this.tail) {this.tail.next = newNode;newNode.prev = this.tail;}this.tail = newNode;}this.size++;return true;}// 从队列前端删除元素deleteFront(): boolean {if (this.isEmpty()) {return false;}if (this.head) {this.head = this.head.next;if (this.head) {this.head.prev = null;} else {this.tail = null; // 如果删除后队列为空,更新尾指针}}this.size--;return true;}// 从队列末端删除元素deleteLast(): boolean {if (this.isEmpty()) {return false;}if (this.tail) {this.tail = this.tail.prev;if (this.tail) {this.tail.next = null;} else {this.head = null; // 如果删除后队列为空,更新头指针}}this.size--;return true;}// 获取队列前端的元素getFront(): number {if (this.isEmpty()) {return -1;}return this.head?.val ?? -1;}// 获取队列末端的元素getRear(): number {if (this.isEmpty()) {return -1;}return this.tail?.val ?? -1;}// 检查队列是否为空isEmpty(): boolean {return this.size === 0;}// 检查队列是否已满isFull(): boolean {return this.size === this.capacity;}
}/*** Your MyCircularDeque object will be instantiated and called as such:* var obj = new MyCircularDeque(k)* var param_1 = obj.insertFront(value)* var param_2 = obj.insertLast(value)* var param_3 = obj.deleteFront()* var param_4 = obj.deleteLast()* var param_5 = obj.getFront()* var param_6 = obj.getRear()* var param_7 = obj.isEmpty()* var param_8 = obj.isFull()*/

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

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

相关文章

SpringBoot 整合 SpringMVC:SpringMVC的注解管理

分类&#xff1a; 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器&#xff1a; 中央转发器被 SpringBoot 自动接管&#xff0c;不需要我们在 web.xml 中配置&#xff1a; <servlet><servlet-name>chapter2&l…

Zemax 中带有体素探测器的激光谐振腔

激光谐振腔是激光系统的基本组成部分&#xff0c;在光的放大和相干激光辐射的产生中起着至关重要的作用。 激光腔由两个放置在光学谐振器两端的镜子组成。一个镜子反射率高&#xff08;后镜&#xff09;&#xff0c;而另一个镜子部分透明&#xff08;输出耦合器&#xff09;。…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.5 高级索引应用:图像处理中的区域提取

2.5 高级索引应用&#xff1a;图像处理中的区域提取 目录/提纲 #mermaid-svg-BI09xc20YqcpUam7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BI09xc20YqcpUam7 .error-icon{fill:#552222;}#mermaid-svg-BI09xc20…

[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

本地部署DeepSeek-R1保姆级教程

近期&#xff0c;我国一款开源模型 DeepSeek-R1以低成本和高性能震撼了全球科技界。该模型的开源性使开发者能够在本地环境中部署和运行&#xff0c;提供了更高的灵活性和控制力。如果你也想在本地部署 DeepSeek-R1&#xff0c;可以参考以下完整的教程&#xff0c;涵盖Mac 版本…

仿真设计|基于51单片机的贪吃蛇游戏

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 利用单片机8*8点阵实现贪吃蛇游戏的控制。 仿真演示视频&#xff1a; 51-基于51单片机的贪吃蛇游…

【4Day创客实践入门教程】Day2 探秘微控制器——单片机与MicroPython初步

Day2 探秘微控制器——单片机与MicroPython初步 目录 Day2 探秘微控制器——单片机与MicroPython初步MicroPython语言基础开始基础语法注释与输出变量模块与函数 单片机基础后记 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机…

ubuntu 下使用deepseek

安装Ollama sudo snap install ollama 执行 ollama run deepseek-coder 然后进行等待。。。

消息队列应用示例MessageQueues-STM32CubeMX-FreeRTOS《嵌入式系统设计》P343-P347

消息队列 使用信号量、事件标志组和线标志进行任务同步时&#xff0c;只能提供同步的时刻信息&#xff0c;无法在任务之间进行数据传输。要实现任务间的数据传输&#xff0c;一般使用两种方式&#xff1a; 1. 全局变量 在 RTOS 中使用全局变量时&#xff0c;必须保证每个任务…

本地缓存~

前言 Caffeine是使用Java8对Guava缓存的重写版本&#xff0c;在Spring Boot 2.0中取而代之&#xff0c;基于LRU算法实现&#xff0c;支持多种缓存过期策略。 以下摘抄于https://github.com/ben-manes/caffeine/wiki/Benchmarks-zh-CN 基准测试通过使用Java microbenchmark ha…

Unity Shader Graph 2D - 角色身体电流覆盖效果

在游戏中,通常会有游戏角色受到“电击”的效果,此时游戏角色身体上会覆盖有电流,该效果能表明游戏角色的当前状态,让玩家能够获得更直观更好的体验。 那么如何实现呢 首先创建一个ShaderGraph文件,命名为Current,再创建对应的材质球M_Current。 基础的资源显示 老规矩,…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.9 广播陷阱:形状不匹配的深层隐患

2.9 广播陷阱&#xff1a;形状不匹配的深层隐患 目录 #mermaid-svg-F0AgBChfSCGzOqa7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-F0AgBChfSCGzOqa7 .error-icon{fill:#552222;}#mermaid-svg-F0AgBChfSCGzOqa7 …

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后&#xff0c;本文将介绍如何使用 OpenCV 对这些海报进行智…

vue入门到实战 二

目录 2.1 计算属性computed 2.1.1什么是计算属性 2.1.2 只有getter方法的计算属性 2.1.3 定义有getter和setter方法的计算属性 2.1.4 计算属性和methods的对比 2.2 监听器属性watch 2.2.1 watch属性的用法 2.2.2 computed属性和watch属性的对比 2.1 计算属性computed…

【DeepSeek】本地快速搭建DeepSeek

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 本地快速搭建DeepSeek一、安装及配置ollama二、DeepSeek模型…

Spring WebFlux揭秘:下一代响应式编程框架,与Spring MVC有何不同?

Spring WebFlux和Spring MVC都是Spring家族里的成员&#xff0c;它们都能帮助我们开发Web应用&#xff0c;但工作方式有所不同。 可以把Spring MVC想象成一个服务员&#xff0c;每次有客人&#xff08;请求&#xff09;来&#xff0c;它就会专门找一个服务员&#xff08;线程&a…

基于微信小程序的实习记录系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

MySQL5.5升级到MySQL5.7

【卸载原来的MySQL】 cmd打开命令提示符窗口&#xff08;管理员身份&#xff09;net stop mysql&#xff08;先停止MySQL服务&#xff09; 3.卸载 切换到原来5.5版本的bin目录&#xff0c;输入mysqld remove卸载服务 测试mysql -V查看Mysql版本还是5.5 查看了环境变量里的…

TensorFlow 简单的二分类神经网络的训练和应用流程

展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括&#xff1a; 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中&#xff0c;数据准备是通过两个 Numpy 数…

使用朴素贝叶斯对散点数据进行分类

本文将通过一个具体的例子&#xff0c;展示如何使用 Python 和 scikit-learn 库中的 GaussianNB 模型&#xff0c;对二维散点数据进行分类&#xff0c;并可视化分类结果。 1. 数据准备 假设我们有两个类别的二维散点数据&#xff0c;每个类别包含若干个点。我们将这些点分别存…