每日算法一练:剑指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
  • 最多会对 pushpop 进行 10000 次调用

用两个栈实现队列操作总结

        题目通过两个栈的配合,实现队列的两大操作:队尾插入(appendTail)队首删除(deleteHead)。以下是实现逻辑的详细总结。

核心思想

  1. 使用两个栈 AB
    • 栈 A:用于保存新插入的元素(队尾操作)。
    • 栈 B:用于保存倒序的元素(队首操作)。
  2. 倒序逻辑
    • B 为空时,将 A 中所有元素出栈并入栈到 B,使 B 中的顺序与队列的顺序一致。
  3. 操作分工:
    • 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]

复杂度分析

  1. 时间复杂度
    • appendTail:仅对栈 A 操作,时间复杂度为 O(1)。
    • deleteHead
      • B 不为空时,直接出栈操作,时间复杂度为 O(1)。
      • B 为空时,需要将栈 A 的所有元素转移到栈 B,每个元素只转移一次,因此均摊复杂度为 O(1)。
    • 总体时间复杂度:O(1)(均摊)。
  2. 空间复杂度:两个栈最多存储 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
  • poptop 和 getMin 操作总是在 非空栈 上调用
  • pushpoptop 和 getMin 最多被调用 3 * 104 次

用两个栈实现支持获取最小值的栈

题目难点

        普通栈的基本操作(push()pop()top())时间复杂度为 O(1)。但在获取最小值时,直接遍历栈会使 getMin() 的时间复杂度变为 O(N)。

目标是实现一个栈,并保证:

  • 所有操作的时间复杂度为 O(1),包括 getMin()

解题思路

利用两个栈来分别存储数据和辅助信息:

  1. 数据栈 A
    • 存储所有压入的数据元素。
    • 保证常规的栈操作(pushpoptop)正常。
  2. 辅助栈 B
    • 始终维护一个非严格降序子序列,即栈顶为当前栈的最小值。
    • 每次压入或弹出时,保持与数据栈的最小值对应关系。

辅助栈的作用:

  • 压入元素时
    • 如果栈为空或当前元素小于等于栈顶元素,将元素同步压入辅助栈。
  • 弹出元素时
    • 如果弹出的元素等于辅助栈的栈顶元素,辅助栈同步弹出。

方法设计

  1. push(x)
    • 数据栈 A 添加元素 x
    • B 为空或 x ≤ B.peek(),将 x 压入辅助栈 B
  2. pop()
    • 从数据栈 A 弹出一个元素,记为 y
    • y == B.peek(),从辅助栈 B 同步弹出。
  3. top()
    • 返回数据栈 A 的栈顶元素。
  4. 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}
}

复杂度分析

  1. 时间复杂度
    • push()pop()top()getMin() 操作均为 O(1),因为每次只需操作一个或两个栈的栈顶元素。
  2. 空间复杂度
    • 最差情况下,所有元素都被压入辅助栈,空间复杂度为 O(N)。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测

背景 如果你要为应用程序构建规范或用户故事&#xff0c;那么务必先把应用程序每个组件的监控指标考虑进来&#xff0c;千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章&#xff0c;当…

突破工业管理新高度:AI多模态引擎赋能设备维护管理

结合AI技术&#xff0c;可以帮助企业提升设备维护效率和管理复杂信息的能力。以下是一个详细流程和思路&#xff1a; 1. 项目背景概述 在高端制造业领域&#xff0c;如飞机、轮船、光刻机等设备的操作手册及零件图纸涉及大量的零配件信息和操作维护流程。传统方式难以高效管理…

C++重写和重定义和重载

重写 概念&#xff1a; 重写发生在类的继承体系中&#xff0c;是指在派生类中重新定义基类中已声明为虚函数&#xff08;使用 virtual 关键字修饰&#xff09;的函数。其目的是让派生类根据自身的需求对基类的虚函数提供不同的具体实现&#xff0c;从而实现运行时多态。 规则及…

centos7在使用yum源安装依赖时报错

1.在centos7中使用yum命令时候报错如下类似信息&#xff1a; Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - "Could not resol…

小版本大不同 | Navicat 17 新增 TiDB 功能

近日&#xff0c;Navicat 17 迎来了小版本更新。此次版本新增了对 PingCap 公司的 TiDB 开源分布式关系型数据库的支持&#xff0c;进一步拓展了 Navicat 的兼容边界。即日起&#xff0c;Navicat 17 所有用户可免费升级至最新版本&#xff0c;通过 Navicat 工具实现 TiDB 数据库…

python 编程 在 Matplotlib 中 默认预定的所有颜色,可以使用多种方法来指定颜色,包括预定义的颜色名称、十六进制颜色代码、

在 Matplotlib 中&#xff0c;可以使用多种方法来指定颜色&#xff0c;包括预定义的颜色名称、十六进制颜色代码、RGB 元组等。如果你想要一个比较深的颜色&#xff0c;你可以选择一些预定义的深色名称&#xff0c;或者使用较低的亮度值来定义自己的颜色。 以下是一些预定义的…

【基于Java Springboot敬老院管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库…

JRebel插件,全教程

JRebel是一套JavaEE开发工具。相信大家都用过&#xff0c;但是频繁的需要激活&#xff0c;已经让java开发者烦不胜烦。 本篇文章来给大家解决这个烦恼。当然没有用过的同行&#xff0c;我也跟大家介绍一下: 简单来说&#xff0c;Jrebel 可快速实现热部署&#xff0c;在本地开发…

PPPoE技术详解

一 &#xff0c; 背景 随着运营商对宽带接入技术要求的不断提高&#xff0c;以xDSL&#xff0c;CableModem和以太网为主的几种宽带接入技术在用户管理和计费等方面的不足开始显露&#xff0c;已无法满足运营商的需求。 在众多的技术中&#xff0c;以太网接入方式经济实惠&…

[JAVA]MyBatis环境配置介绍

什么是MyBatis环境配置&#xff1f; MyBatis是基于JDBC对数据库进行操作&#xff0c;在我们进行数据操作时&#xff0c;我们需要告诉MyBatis我们连接哪个数据库&#xff0c;ip地址&#xff0c;数据库名称&#xff0c;用户名密码等。以此来进行环境配置。 首先&#xff0c;MyB…

Javascirpt时区——脱坑指南

最近业务反馈了一个约课功能的问题&#xff0c;澳大利亚的用户反馈&#xff0c;无法进行选课。排查之后发现是时区不对引起的&#xff0c;由于时区的偏差已经超过时间&#xff0c;导致无法选课。 这里对js中处理时区的问题做一些总结。 时区 时区&#xff08;Time Zone&#xf…

不用来回切换,一个界面管理多个微信

你是不是也有多个微信号需要管理&#xff1f; 是不是也觉得频繁切换账号很麻烦&#xff1f; 是不是也想提升多账号管理的效率&#xff1f; 在工作中&#xff0c;好的辅助工具&#xff0c;能让我们的效率加倍增长&#xff01; 今天&#xff0c; 就给大家分享一个多微管理工具…

每日OJ题_牛客_AB32【模板】哈夫曼编码_C++_Java

目录 牛客_AB32【模板】哈夫曼编码 题目解析 C代码 Java代码 牛客_AB32【模板】哈夫曼编码 【模板】哈夫曼编码_牛客题霸_牛客网 描述&#xff1a; 给出一个有n种字符组成的字符串&#xff0c;其中第ii种字符出现的次数为ai​。请你对该字符串应用哈夫曼编码&#xff0c;…

UDP协议

​ UDP协议 前置知识一、应用层的进程为什么要bind端口号二、如何确定网络中的一个进程三、进程 服务 协议 端口之间的关系四、常见的协议对应的端口五、一些命令六、一个进程能不能绑定多个端口号&#xff0c;一个端口号能不能被多个进程绑定七、对任何一个协议报文的认识 UD…

KkFileView4.1.0部署文档--linux

先看下官方文档&#xff1a;kkFileView - 在线文件预览 环境要求中的JDK8如果没有的&#xff0c;需先安装JDK8&#xff0c;这里不做展示。 第二个office相关环境要求在linux中会自动下载安装&#xff0c;不用管。 1、下载地址 Linux 或 MacOS 版&#xff1a; https://kkfil…

[论文笔记]An LLM Compiler for Parallel Function Calling

引言 今天带来一篇优化函数调用的论文笔记——An LLM Compiler for Parallel Function Calling。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 当前的函数(工具)调用方法通常需要对每个函数进行顺序推理和操作&…

基于JAVA的资源检索系统(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

展望:多模态融合与marker推断

技术进步使得利用高维、高通量、多尺度的生物医学数据从多个角度研究患者和疾病成为可能。在肿瘤学中&#xff0c;正在生成大量数据&#xff0c;从分子、组织病理学到临床记录。深度学习的引入极大地促进了生物医学数据的分析。然而&#xff0c;大多数方法都侧重于单一模态&…

AI在电商平台中的创新应用:提升销售效率与用户体验的数字化转型

1. 引言 AI技术在电商平台的应用已不仅仅停留在基础的数据分析和自动化推荐上。随着人工智能的迅速发展&#xff0c;越来越多的电商平台开始将AI技术深度融合到用户体验、定价策略、供应链优化、客户服务等核心业务中&#xff0c;从而显著提升运营效率和用户满意度。在这篇文章…

基于Java Springboot餐厅点餐系统(加入商家版)

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL5.7…