每日算法一练:剑指offer——栈与队列篇(1)
1.图书整理II
读者来到图书馆排队借还书,图书管理员使用两个书车来完成整理借还书的任务。书车中的书从下往上叠加存放,图书管理员每次只能拿取书车顶部的书。排队的读者会有两种操作:
push(bookID)
:把借阅的书籍还到图书馆。pop()
:从图书馆中借出书籍。
为了保持图书的顺序,图书管理员每次取出供读者借阅的书籍是 最早 归还到图书馆的书籍。你需要返回 每次读者借出书的值 。
如果没有归还的书可以取出,返回 -1
。
示例 1:
输入:
["BookQueue", "push", "push", "pop"]
[[], [1], [2], []]
输出:[null,null,null,1]
解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.pop(); // return 1, queue is [2]
提示:
1 <= bookID <= 10000
- 最多会对
push
、pop
进行10000
次调用
用两个栈实现队列操作总结
题目通过两个栈的配合,实现队列的两大操作:队尾插入(appendTail)和队首删除(deleteHead)。以下是实现逻辑的详细总结。
核心思想
- 使用两个栈
A
和B
:- 栈 A:用于保存新插入的元素(队尾操作)。
- 栈 B:用于保存倒序的元素(队首操作)。
- 倒序逻辑:
- 当
B
为空时,将A
中所有元素出栈并入栈到B
,使B
中的顺序与队列的顺序一致。
- 当
- 操作分工:
appendTail(value)
:直接将元素压入栈A
。deleteHead()
:- 若栈
B
不为空,则弹出并返回B
的栈顶元素。 - 若栈
B
为空但栈A
不为空,将栈A
中所有元素转移到栈B
,然后从B
出栈。 - 若两个栈都为空,返回
-1
。
- 若栈
代码实现
import java.util.LinkedList;class CQueue {private LinkedList<Integer> A; // 栈 Aprivate LinkedList<Integer> B; // 栈 B// 构造函数,初始化两个栈public CQueue() {A = new LinkedList<>();B = new LinkedList<>();}// 队尾插入操作public void appendTail(int value) {A.addLast(value); // 将元素压入栈 A}// 队首删除操作public int deleteHead() {if (!B.isEmpty()) {return B.removeLast(); // 栈 B 不为空时,弹出并返回栈顶元素}if (A.isEmpty()) {return -1; // 两个栈都为空时,返回 -1}// 将栈 A 中的所有元素转移到栈 Bwhile (!A.isEmpty()) {B.addLast(A.removeLast());}return B.removeLast(); // 返回栈 B 的栈顶元素}
}
操作示例
以输入和输出为例:
CQueue myQueue = new CQueue();
myQueue.appendTail(1); // 栈 A: [1], 栈 B: []
myQueue.appendTail(2); // 栈 A: [1, 2], 栈 B: []
System.out.println(myQueue.deleteHead()); // 输出: 1, 栈 A: [], 栈 B: [2]
复杂度分析
- 时间复杂度:
appendTail
:仅对栈A
操作,时间复杂度为 O(1)。deleteHead
:- 栈
B
不为空时,直接出栈操作,时间复杂度为 O(1)。 - 栈
B
为空时,需要将栈A
的所有元素转移到栈B
,每个元素只转移一次,因此均摊复杂度为 O(1)。
- 栈
- 总体时间复杂度:O(1)(均摊)。
- 空间复杂度:两个栈最多存储 N 个元素,空间复杂度为 O(N)。
2.最小栈
请你设计一个 最小栈 。它提供 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
示例 1:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[2],[-3],[],[],[],[]]输出:
[null,null,null,null,-3,null,2,-2]解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(2);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 2.
minStack.getMin(); --> 返回 -2.
提示:
-231 <= val <= 231 - 1
pop
、top
和getMin
操作总是在 非空栈 上调用push
、pop
、top
和getMin
最多被调用3 * 104
次
用两个栈实现支持获取最小值的栈
题目难点
普通栈的基本操作(push()
、pop()
、top()
)时间复杂度为 O(1)。但在获取最小值时,直接遍历栈会使 getMin()
的时间复杂度变为 O(N)。
目标是实现一个栈,并保证:
- 所有操作的时间复杂度为 O(1),包括
getMin()
。
解题思路
利用两个栈来分别存储数据和辅助信息:
- 数据栈
A
:- 存储所有压入的数据元素。
- 保证常规的栈操作(
push
、pop
、top
)正常。
- 辅助栈
B
:- 始终维护一个非严格降序子序列,即栈顶为当前栈的最小值。
- 每次压入或弹出时,保持与数据栈的最小值对应关系。
辅助栈的作用:
- 压入元素时:
- 如果栈为空或当前元素小于等于栈顶元素,将元素同步压入辅助栈。
- 弹出元素时:
- 如果弹出的元素等于辅助栈的栈顶元素,辅助栈同步弹出。
方法设计
push(x)
:- 数据栈
A
添加元素x
。 - 若
B
为空或x ≤ B.peek()
,将x
压入辅助栈B
。
- 数据栈
pop()
:- 从数据栈
A
弹出一个元素,记为y
。 - 若
y == B.peek()
,从辅助栈B
同步弹出。
- 从数据栈
top()
:- 返回数据栈
A
的栈顶元素。
- 返回数据栈
getMin()
:- 返回辅助栈
B
的栈顶元素,即当前栈的最小值。
- 返回辅助栈
代码实现
import java.util.Stack;class MinStack {private Stack<Integer> A; // 数据栈private Stack<Integer> B; // 辅助栈(存储最小值)// 初始化栈public MinStack() {A = new Stack<>();B = new Stack<>();}// 压入栈操作public void push(int x) {A.push(x); // 压入数据栈// 如果辅助栈为空或者当前元素 <= 辅助栈顶,则同步压入if (B.isEmpty() || x <= B.peek()) {B.push(x);}}// 弹出栈操作public void pop() {// 如果弹出的元素等于辅助栈栈顶元素,则辅助栈同步弹出if (A.pop().equals(B.peek())) {B.pop();}}// 获取栈顶元素public int top() {return A.peek();}// 获取最小值public int getMin() {return B.peek(); // 辅助栈顶始终存储当前栈的最小值}
}
操作示例
public class Main {public static void main(String[] args) {MinStack minStack = new MinStack();minStack.push(3); // 数据栈: [3], 辅助栈: [3]minStack.push(4); // 数据栈: [3, 4], 辅助栈: [3]minStack.push(2); // 数据栈: [3, 4, 2], 辅助栈: [3, 2]minStack.push(2); // 数据栈: [3, 4, 2, 2], 辅助栈: [3, 2, 2]minStack.push(5); // 数据栈: [3, 4, 2, 2, 5], 辅助栈: [3, 2, 2]System.out.println(minStack.getMin()); // 输出: 2minStack.pop(); // 数据栈: [3, 4, 2, 2], 辅助栈: [3, 2, 2]System.out.println(minStack.getMin()); // 输出: 2minStack.pop(); // 数据栈: [3, 4, 2], 辅助栈: [3, 2]System.out.println(minStack.getMin()); // 输出: 2}
}
复杂度分析
- 时间复杂度:
push()
、pop()
、top()
和getMin()
操作均为 O(1),因为每次只需操作一个或两个栈的栈顶元素。
- 空间复杂度:
- 最差情况下,所有元素都被压入辅助栈,空间复杂度为 O(N)。
相关文章:
每日算法一练:剑指offer——栈与队列篇(1)
1.图书整理II 读者来到图书馆排队借还书,图书管理员使用两个书车来完成整理借还书的任务。书车中的书从下往上叠加存放,图书管理员每次只能拿取书车顶部的书。排队的读者会有两种操作: push(bookID):把借阅的书籍还到图书馆。pop…...
【Java】ArrayList与LinkedList详解!!!
目录 一🌞、List 1🍅.什么是List? 2🍅.List中的常用方法 二🌞、ArrayList 1🍍.什么是ArrayList? 2🍍.ArrayList的实例化 3🍍.ArrayList的使用 4🍍.ArrayList的遍…...
怎么用VIM查看UVM源码
利用ctags工具可以建立源码的索引表,在使用VIM或其他文本编辑器时,就可以跳转查看所调用的UVM或VIP的funtcion/task/class等源码了。 首先需要确认ctags安装,一般安装VIM后都有,如果没有可以手动安装。在VIM中可以输入:help ctag…...
数据结构C语言描述3(图文结合)--双链表、循环链表、约瑟夫环问题
前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…...
第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令
文章目录 第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令TCP 设备的 READ 命令READ 修改 $ZA 和 $ZB$ZA 和 READ 命令 第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令 TCP 设备的 READ 命令 从服务器或客户端发出 READ 命令以读取客户端或服务器设置的…...
【C++】哈希表的实现详解
哈希表的实现详解 一、哈希常识1.1、哈希概念1.2、哈希冲突1.3、哈希函数(直接定执 除留余数)1.4、哈希冲突解决闭散列(线性探测 二次探测)开散列 二、闭散列哈希表的模拟实现2.1、框架2.2、哈希节点状态的类2.3、哈希表的扩容2…...
高阶C语言之五:(数据)文件
目录 文件名 文件类型 文件指针 文件的打开和关闭 文件打开模式 文件操作函数(顺序) 0、“流” 1、字符输出函数fputc 2、字符输入函数fgetc 3、字符串输出函数fputs 4、 字符串输入函数fgets 5、格式化输入函数fscanf 6、格式化输出函数fpr…...
服务器上部署并启动 Go 语言框架 **GoZero** 的项目
要在服务器上部署并启动 Go 语言框架 **GoZero** 的项目,下面是一步步的操作指南: ### 1. 安装 Go 语言环境 首先,确保你的服务器上已安装 Go 语言。如果还没有安装,可以通过以下步骤进行安装: #### 1.1 安装 Go 语…...
【Java SE 】继承 与 多态 详解
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 继承 1.1 继承的原因 1.2 继承的概念 1.3 继承的语法 2. 子类访问父类 2.1 子类访问父类成员变量 2.1.1 子类与父类不存在同名成员变量 2.1.2 子类…...
【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法
【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法 目录 文章目录 【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法目录摘要:研究背景:问题与挑战:如何解…...
秋招大概到此结束了
1、背景 学院本,软工,秋招只有同程,快手和网易面试,后两家kpi(因为面试就很水),秋招情况:哈啰(实习转正ing),同程测开offer。 2、走测开的原因 很…...
华为OD机试真题---字符串化繁为简
华为OD机试真题中的“字符串化繁为简”题目是一个涉及字符串处理和等效关系传递的问题。以下是对该题目的详细解析: 一、题目描述 给定一个输入字符串,字符串只可能由英文字母(a~z、A~Z)和左右小括号((、)࿰…...
概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?
随着容器技术的日渐成熟,不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面,很多运维人员都更熟悉虚拟化环境,对“容器圈”的各种概念容易混淆:容器就是 Kubernetes 吗?容器云又是什么?容器…...
初识Arkts
创建对象: 类: 类声明引入一个新类型,并定义其字段、方法和构造函数。 定义类后,可以使用关键字new创建实例 可以使用对象字面量创建实例 在以下示例中,定义了Person类,该类具有字段name和surname、构造函…...
基本的SELECT语句
1.SQL概述 SQL(Structured Query Language)是一种用于管理和操作关系数据库的编程语言。它是一种标准化的语言,用于执行各种数据库操作,包括创建、查询、插入、更新和删除数据等。 SQL语言具有简单、易学、高效的特点,…...
51c自动驾驶~合集30
我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱,行动更加稳健 目前四足机器人的全球市场上,市场份额最大的是哪个国家的企业?A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 …...
Python Tutor网站调试利器
概述 本文主要是推荐一个网站:Python Tutor. 网站首页写道: Online Compiler, Visual Debugger, and AI Tutor for Python, Java, C, C++, and JavaScript Python Tutor helps you do programming homework assignments in Python, Java, C, C++, and JavaScript. It contai…...
h5小游戏实现获取本机图片
h5小游戏实现获取本机图片 本文使用cocos引擎 1.1 需求 用户通过文件选择框选择图片。将图片内容转换为Cocos Creator的纹理 (cc.Texture2D),将纹理设置到 cc.SpriteFrame 并显示到节点中。 1.2 实现步骤 创建文件输入框用于获取文件 let input document.createElement(&quo…...
前端 javascript a++和++a的区别
前端 javascript a和a的区别 a 是先执行表达式后再自增,执行表达式时使用的是a的原值。a是先自增再执行表达示,执行表达式时使用的是自增后的a。 var a0 console.log(a); // 输出0 console.log(a); // 输出1var a0 console.log(a); // 输出1 console.l…...
OceanBase V4.x应用实践:如何排查表被锁问题
DBA在日常工作中常常会面临以下两种常见情况: 业务人员会提出问题:“表被锁了,导致业务受阻,请帮忙解决。” 业务人员还会反馈:“某个程序通常几秒内就能执行完毕,但现在却运行了好几分钟,不清楚…...
ctfshow-web入门-SSRF(web351-web360)
目录 1、web351 2、web352 3、web353 4、web354 5、web355 6、web356 7、web357 8、web358 9、web359 10、web360 1、web351 看到 curl_exec 函数,很典型的 SSRF 尝试使用 file 协议读文件: urlfile:///etc/passwd 成功读取到 /etc/passwd 同…...
【日常记录-Git】如何为post-checkout脚本传递参数
1. 简介 在Git中,post-checkout 钩子是一个在git checkout 或git switch命令成功执行后自动调用的脚本。该脚本不接受任何来自Git命令的直接参数,因为Git设计该钩子是为了在特定的版本控制操作后执行一些预定义的任务,而不是作为一个通用的脚…...
《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期
消除误解,课程资料逐步公开。 复习资料: Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷: 开卷考试,时间: 2024年11月16日 001 002 003 004 005 ……………………装………………………...
后台管理系统(开箱即用)
很久没有更新博客了,给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理,部门管理&#…...
5G CPE与4G CPE的主要区别有哪些
什么是CPE? CPE是Customer Premise Equipment(客户前置设备)的缩写,也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备,用于连接用户…...
量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说A股平均趋向指数实现。 …...
tcp的网络惊群问题
1. SO_REUSEPORT 可以解决epoll的惊群问题 但是,现在的 TCP Server,一般都是 多进程多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进…...
云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…...
软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障,网络安全单元按照一定的规则,相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制,通过各…...
机器学习——期末复习 重点题归纳
第一题 问题描述 现有如下数据样本: 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 (1)根据上表,给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”,…...
青海公路建设信息服务网站/sem竞价专员
web应用程序库怎么导入Andreas Herz发布了Verside ,这是一个新的在线开发工具和界面设计器,用于构建数据库驱动的Web应用程序。 Verside建立在Open-jACOB Web应用程序框架上。 Verside在Tomcat Servlet容器上运行,并允许您创建具有完整CRUD功…...
网站开发进度计划/互联网销售是什么意思
一、什么是MVCC? Multiversion concurrency control (多版本并发控制) 并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理.以用来避免写操作的堵塞,从而引发读操作的并发问题 二、 MVCC中的插入流程 数据行当中有隐藏的2列 DB_TRX_ID:数据行的版本号,即事务的…...
淄博网站制作公司/免费外网加速器
数据挖掘是指以某种方式分析数据源,从中发现一些潜在的有用的信息,所以数据挖掘又称作知识发现,而关联规则挖掘则是数据挖掘中的一个很重要的课题,顾名思义,它是从数据背后发现事物之间可能存在的关联或者联系。举个最…...
域名数和网站数/深圳网站设计公司哪家好
EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。支持同时生成生成…...
在深圳做网站/网络营销方案有哪些
俗话说"龙生龙凤生凤老鼠的孩子会打洞",每种动物都有各自的特性,比如老鼠会打洞猫会爬树鲨鱼会游泳不同种类有不同的天性。而在程序员的思维中,动物是对象, 天性是这个类方法或者属性。再延伸一下,比如Python是面向对象…...
四川 法治政府建设 网站/长沙网络推广小公司
北上广深等一线城市的人口日益增多,职场白领群体增加,而办公软件的使用,更是帮助白领们提高效率、企业节省运营成本的有效方式,而对于个人邮箱品牌的选择上,更是有种选优,TOM VIP邮箱凭借独特的优势&#x…...