剑指offer—day1.用两个栈实现队列、包含min函数的栈

news2024/12/23 1:51:16

1.用两个栈实现队列

本题来源:力扣

剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/题目描述 

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例1

输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[  [],[3],[],[],[]  ]
输出:[null,null,3,-1,-1]

示例2

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[  [],[],[5],[2],[],[]  ]
输出:[null,-1,null,null,5,2]

示例解读

  • CQueue为构造函数,对类进行初始化,但并不往里面加数据,[ ]代表没有返回值
  • appendTail在队尾增加元素,没有返回值[ ]
  • deleteHead删除队首元素,若队内没有元素(示例2),则返回-1,若有元素(示例1),则返回这个被删除的元素

 解题思路

由于队列先进先出的性质,要确保最后的出栈操作时,出栈顺序和入栈顺序一样,要点

  • 入栈操作不必过多关注
  • 出栈操作是重点

具体过程如下

  1. 准备两个栈(s1和s2),s1用于入数据,s2用于出数据
  2. 入数据时往s1入,不用考虑其他
  3. 出数据时,先检查s2中有没有数据,如果有则可以直接记录并出栈顶数据
  4. 如果s2中没有数据,检查s1,如果s1中也没有数据,返回-1
  5. 如果s1中有数据,则将s1中所有数据依次出栈,并依次往s2入栈,此时越晚在s1入栈的元素在s2中的位置就越接近栈底,入栈越早的越在栈顶
  6. 此时再重复步骤3

实现代码

class CQueue {
public:
    CQueue() {}
    
    void appendTail(int value) {  // 步骤2
        s1.push(value);
    }
    
    int deleteHead() {
        int ret;
        if(!s2.empty())   // 步骤3
        {
           ret = s2.top(); 
           s2.pop();
        }

        // no data in s2, check s1
        else                         // 步骤4
        {
            if(s1.empty())
            {
                return -1;  // if s1 is empty, there is no integer push ,return -1
            }

            // If there is data in s1,the  will be exited and all will enter s2
            while(!s1.empty())        // 步骤5
            {
                int tmp = s1.top();
                s2.push(tmp);
                s1.pop();
            }

            ret = s2.top();          // 步骤6
            s2.pop();
        }

        return ret;
    }
private:
    // 步骤1
    stack<int> s1; // s1 is uesd to input integer
    stack<int> s2; // s2 is used to output integer
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

 

2. 包含min函数的栈

题目来源:力扣

剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)

示例

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

解题思路

对于一个栈,pop和push操作均为O(1),因此本题所考察的是如何实现O(1)的找最小值,原生stack需要遍历,时间复杂度为O(N),因此解题的思路是使用另外一个栈来动态保存栈的最小值

我们一共使用两个栈,s1用于数据入栈,s2用于存储当前栈的最小值,有几点需要注意

  • 每次入栈时,都检查这个元素是否比s2的栈顶元素大,如果是,则说明s2的栈顶仍然保存s1中最小的那个元素,此时这个元素就只往s1入栈,不入s2。例如,s1入栈顺序为2,3,1,那么s2中入栈顺序为2,1
  • 如果s1入栈顺序为2,1,1,那么s2中需要将两个1全部入栈,因为如果只入栈一个1,那么s1pop()之后,s2也要pop(),此时s1:2,1 而s2:2,就不匹配

具体过程如下

  1. 准备两个栈(s1和s2),s1用于入数据,s2用于动态保存s1中的最小值
  2. 入栈时检查入栈元素和s2栈顶元素的大小(注意s2为空的情况)
  3. 如果栈空或者入栈元素小于等于s2栈顶元素,则s1和s2都入栈
  4. 如果入栈元素大于s2栈顶元素,则只入s1
  5. 出栈时,如果s1栈顶元素于(这里只可能大于或者等于)s2栈顶元素,则只出栈s1
  6. 如果s1栈顶元素等于s2栈顶元素,则s1和s2同时出栈
  7. s2的栈顶一直保存s1的最小值,故时间复杂度为O(1)

实现代码

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack()  {}
     
    void push(int x) {                    // 步骤2
        // if s2 is empty or the entered value isn't greater than the top element in s2,record it
        if(s2.empty() || s2.top() >= x)   // 步骤3
        {
            s1.push(x);
            s2.push(x);
        }

        // if the entered value is greater than the top element in s2, don't push it to s2 
        else                               // 步骤4   
        {
            s1.push(x); 
        }
    }
    
    // be careful when pop an element,compare s1.top and s2.top firstly to check if it
    void pop() {                      
        if(s1.top() > s2.top()) // s1.top > s2.top, just pop s1  // 步骤5
        {
            s1.pop();
        }
        else                    // pop s1 and s2 both            // 步骤6
        {
            s1.pop();
            s2.pop();
        }
    }
    
    int top() {
        return s1.top();
    }
    
    int min() {                             // 步骤7
        return s2.top();
    }
 
private:                     // 步骤1
    stack<int> s1; // stack s1 is used store data
    stack<int> s2; // stack s2 is used to record the minimum element in s1
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->min();
 */

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

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

相关文章

IP-guard如何映射到外网登录访问管理

终端安全管理(endpoint security management)是一种保护网络安全的策略式方法&#xff0c;它需要终端设备在得到访问网络资源的许可之前遵从特定的标准。随着企业信息化发展&#xff0c;终端安全管理系统需求不断扩大&#xff0c;相关系统软件被广泛应用。 IPguard即IP-guard&a…

线段树(重要!多加理解懒惰标记!)

基础概念&#xff1a; 线段&#xff08;区间&#xff09;[L,R] 所对应的线段树是由区间 [L,R] 及其子区间构成的二叉树&#xff08;如下图所示&#xff09; 线段树具有的特性&#xff1a; &#xff08;1&#xff09;线段树的叶结点为只有一个元素的区间&#xff0c;因此长度为…

最新版海豚调度dolphinscheduler-3.1.3安装部署详细教程

0 背景 本文基于Ambari集群搭建最新版本的海豚调度dolphinscheduler-3.1.3版本&#xff0c;后续会尝试整合到Ambari中。 1 安装准备 安装dolphinscheduler需要在环境中安装如下依赖 ① JDK8 下载JDK (1.8)&#xff0c;安装并配置 JAVA_HOME 环境变量&#xff0c;并将其下的 …

用 22 张照片打开 23 年

魔幻又带有现实主义色彩的三年似乎终将见底。这也为 2023 年赋予了一些新的意义&#xff0c;或许是充满生机、怀揣希望、满怀爱意&#xff0c;或许是重新启航、步履不停、勇敢探索……为此&#xff0c;我们收集了 22 位社区用户和公司小伙伴在过去一年的「特别 Moment」及新年愿…

你认为DAO是否可行?新年计划,卯足干劲,兔必No.1

文章目录&#x1f31f; 课前小差&#x1f31f; 聚沙成塔&#x1f31f; 社会价值&#x1f31f; DAO是什么&#x1f31f; 国产化&#x1f31f; 商业化回报&#x1f31f; 写在最后&#x1f31f; 课前小差 哈喽&#xff0c;大家好&#xff0c;我是几何心凉&#xff0c;这是一份全新…

Spring高级之BeanFactory功能

首先&#xff0c;我们想要知道一个接口有哪些功能&#xff0c;就必须要看这个接口的源代码&#xff0c;在idea中&#xff0c;选中这个接口CtrlF12&#xff0c;来查看这个接口里面有哪些方法&#xff1a; 表面上来看&#xff0c;功能其实很少&#xff0c;查看源码及其方法功能 …

来吧,Jenkins+git+mvn+shell一键部署实践起来

环境&#xff1a;centosJenkins-2.319系统自带gitmvn3.8.7jdk1.8一、安装jdk1、https://blog.csdn.net/codedz/article/details/124044974centos自带了openjdk&#xff0c;我是选择自己重新搞一个&#xff0c;用的上面链接地址的yum安装方式2、安装完成查看版本查看java安装路径…

优思学院|质量人对控制图中的规格线和控制线傻傻分不清?

质量人、六西格玛[1]人和很多不同类型的工程师都需要了解什么是控制图&#xff0c;而在控制图中的规格限制&#xff08;Specification Limit&#xff09;"和"控制限制&#xff08;Control Limit&#xff09;"原来对好多人来说都是傻傻分不清&#xff01; 规格限…

线段树入门

对于一个区间进行询问&#xff0c;进行修改&#xff0c;都是用线段树进行处理。线段树和普通的树不一样&#xff0c;普通的树的节点存的是一个编号&#xff0c;线段树存的是一个区间&#xff0c;而且线段树一定是一棵完全二叉树。例如&#xff1a;这就是一棵线段树。例如对于[1…

【Ajax】数据交换格式XML 和 JSON

一、什么是数据交换格式数据交换格式&#xff0c;就是服务器端与客户端之间进行数据传输与交换的格式。前端领域&#xff0c;经常提及的两种数据交换格式分别是 XML 和 JSON。其中 XML 用的非常少&#xff0c;所以&#xff0c;我们重点要学习的数据交换格式就是 JSON。二、XML1…

让交互更加生动!巧用CSS实现鼠标跟随 3D 旋转效果

简单分析一下&#xff0c;这个交互效果主要有两个核心&#xff1a; 借助了 CSS 3D 的能力 元素的旋转需要和鼠标的移动相结合 本人简单的说一下如何使用纯 CSS 实现类似的交互效果&#xff0c;以及&#xff0c;借助 JavaScript 绑定鼠标事件&#xff0c;快速还原上述效果。 …

数据结构---set篇

第一次超时是因为用memsetmemsetmemset不得不超时&#xff0c;第二次超时是我用vectorvectorvector数组的时候&#xff0c;然后以O(n)O(n)O(n)复杂度查找元素之后使用eraseeraseerase方法进行删除&#xff0c;第三次超时是我把查找元素改成了O(logn)O(logn)O(logn)之后用vector…

epoll的ET和LT模式

简介 epoll对fd的操作有两种模式&#xff1a;LT(Level Trigger&#xff0c;水平触发)模式&#xff0c;和ET&#xff08;Edge Trigger,边缘触发&#xff09;模式。 LT 模式是默认的工作模式&#xff0c;这种模式下&#xff0c;epoll相当于一个效率较高的poll&#xff1b; ET模…

89. 注意力机制以及代码实现Nadaraya-Waston 核回归

1. 心理学 动物需要在复杂环境下有效关注值得注意的点心理学框架&#xff1a;人类根据随意线索和不随意线索选择注意点 随意&#xff1a;随着自己的意识&#xff0c;有点强调主观能动性的意味。 2. 注意力机制 2. 非参注意力池化层 3. Nadaraya-Waston 核回归 4. 参数化的注意…

Downie4.6.4视频下载工具

前言 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 下载 Downie 解压后直接安装 主要特点 支持许多网站目前支持超过1,000个不同的网站&#xff08;包括YouTube&#…

Linux | 浅谈Shell运行原理【王婆竟是资本家】

文章目录&#x1f4a7;Shell的运行原理&#x1f449;Shell的基本概念与作用&#x1f449;原理的展示与剖析&#x1f449;Shell外壳感性理解【一门亲事】&#x1f4a7;总结&#x1f4a7;Shell的运行原理 &#x1f449;Shell的基本概念与作用 Linux严格意义上说的是一个操作系统…

华为数字化转型之道 平台篇 第十三章 变革治理体系

第十三章 变革治理体系 约翰科特在《领导变革》一书中说:“变革的领导团队既需要管理能力,也需要领导能力,他们必须结合起来。 前面我们也谈到,数字化转型不仅是技术的创新,更是一项系统工程和企业真正的变革。企业要转型成功,既需要各个组织的积极参与和通力合作,又不…

深度学习中高斯噪声:为什么以及如何使用

在数学上&#xff0c;高斯噪声是一种通过向输入数据添加均值为零和标准差(σ)的正态分布随机值而产生的噪声。 正态分布&#xff0c;也称为高斯分布&#xff0c;是一种连续概率分布&#xff0c;由其概率密度函数 (PDF) 定义&#xff1a; pdf(x) (1/ (σ*sqrt(2*π))) *e^(- (x…

Task6:文本函数查找函数

文章目录一 文本函数1 Text函数2 mid函数3 replace函数二 查找函数1 Vlookup2 Xlookup一 文本函数 1 Text函数 作用&#xff1a;将数值转换为指定格式的文本 语法&#xff1a;TEXT(value,format_text) &#xff08;1&#xff09;转换为大写 消费日期转换为大写 TEXT(A2,”[DB…

第五届字节跳动青训营 前端进阶学习笔记(六)什么才是好的JavaScript代码

文章目录前言问题引入实现一个交通信号灯的状态切换1.基本实现2.状态封装实现3.职责分离实现求一个数是否是4的幂1.基本实现3.数学优化洗牌算法1.基本实现2.均匀算法实现总结前言 课程重点&#xff1a; 代码规范相关事项如何优化代码 问题引入 试看下面一段代码&#xff0c…