【stack题解】最小栈 | 栈的压入、弹出序列

目录

最小栈

思路

​编辑

实现

栈的压入、弹出序列

思路

实现

需要注意的


最小栈

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

设计一个支持 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],[0],[-3],[],[],[],[]]

输出:

[null,null,null,null,-3,null,0,-2]

解释:

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

思路

这道题的难点有两个,一是理解题意,它不是让我们去模拟实现库里的stack,所以我们可以直接用库里的stack及其接口。

(不要像我一开始拿到题,以为是要模拟实现栈的几个接口,哐哐就开整了。。。)

二是在常数时间内实现“getMin() :获取堆栈中的最小元素”。难在时间复杂度上。

但没关系,有句话叫“用空间换取时间”,这道题就用这个思路解决。

我们在类MinStack里 实例化出两个对象:普通栈st、“越来越小栈”min_st。

数据会直接插入st,却未必能插入min_st。只有比栈顶更小的,才能插入min_st。

实现

class MinStack {
public:
    stack<int> st;
    stack<int> min_st;
​
    MinStack()  
    {}
    
    void push(int val) {
        st.push(val);
        if(min_st.empty()||val<=min_st.top()){  //<=
            min_st.push(val);
        }
    }
    
    void pop() { 
        if(st.top()==min_st.top()){
            min_st.pop();
        } 
        st.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int getMin() {
        return min_st.top();
    }
};

栈的压入、弹出序列

栈的压入、弹出序列_牛客题霸_牛客网

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。

假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

1.0<=pushV.length == popV.length <=1000

2.-1000<=pushV[i]<=1000

3.pushV 的所有数字均不相同

示例1

输入:[1,2,3,4,5],[4,5,3,2,1]
​
返回值:true
​
说明:可以通过
push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true  
    

示例2

输入:[1,2,3,4,5],[4,3,5,1,2]
​
返回值:false
​
说明:由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false

思路

首先我们要明白一件事:栈的元素是可以在中途弹出的,比如[1,2,3,4,5],它的弹出顺序也可以是[1,2,3,4,5]:把1压入再弹出,再把2压入弹出,把3压入弹出……

而[4,3,5,1,2]就不行,我们模拟一下入栈、出栈的顺序就会发现,2一定是在1之前出栈的。

所以这道题,我们要做的就是:实例化一个栈,模拟入栈、出栈的过程。

实现

class Solution {
public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        stack<int> st;
        int pushi=0,popi=0;
​
        while(pushi<pushV.size()){
            st.push(pushV[pushi]);
            pushi++;
​
            while(!st.empty()
            && popV[popi]==st.top()){
                st.pop();
                popi++;
            }
        }
        return st.empty();
    }
};

需要注意的

1.当栈为空时,不要取栈顶数据!会报错

一开始我是这么写的,当测试用例为[2,1,0],[1,2,0]时,程序报段错误。看看错误出在哪:

class Solution {
public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        stack<int> st;
        int pushi = 0, popi = 0;
​
        while (pushi < pushV.size()) {
            st.push(pushV[pushi]);
            pushi++;
​
            while (popi < popV.size()  
                && popV[popi] == st.top()) {
                st.pop();
                popi++;
            }
        }
        return st.empty();
    }
};

错误就出在那个小while循环的判断条件里:

while (popi < popV.size() 
        && popV[popi] == st.top()) { 
    ……
}

最后栈删空了,经过这个循环,会在循环条件里做一个判断,此时调用top()函数,就出问题了。

所以,判断条件应为:

while (!st.empty()
        && popV[popi] == st.top()) { 
    ……
}

所以,当取栈顶数据时,一定要加个判空的前置条件!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

​软考-高级-信息系统项目管理师教程 第四版【第15章-项目风险管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第15章-项目风险管理-思维导图】 课本里章节里所有蓝色字体的思维导图

K8s学习笔记——资源组件篇

引言 前一篇文章我们介绍了K8s的概念理解和常用命令&#xff0c;这篇我们重点介绍K8s的资源组件和相关配置使用。 1. Node & Pod Node: 是 Pod 真正运行的主机&#xff0c;可以是物理机&#xff0c;也可以是虚拟机。为了管理 Pod&#xff0c;每个 Node 节点上至少要运行…

军用机场信息化数字孪生监测平台助力企业运营

随着直升机的不断发展&#xff0c;其在军用和民用领域得到越来越广泛的应用&#xff0c;在民用领域直升机广泛用于客货运输、紧急救援、农林作业、地质勘探、油气开发、公安巡逻等。直升机相关经营数据也逐渐被重视起来&#xff0c;数字孪生公司深圳华锐视点通过web3d开发构建虚…

XR Interaction ToolKit

一、简介 XR Interaction Toolkit是unity官方的XR交互工具包。 官方XRI示例地址&#xff1a;https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples 2023.3.14官方博客&#xff0c;XRIT v2.3 https://blog.unity.com/engine-platform/whats-new-in-xr-int…

8-3、T型加减速单片机程序【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;根据前两节内容&#xff0c;已完成所有计算工作&#xff0c;本节内容介绍具体单片机程序流程及代码 一、程序流程图 根据前两节文章内容可知&#xff0c;T型加减速的关键内容是运动类型的判断以及定时器初值的计算&#xff0c;在输出运动参数后即可判断出运动…

新闻稿的写作注意事项!纯干货

新闻稿是企业、机构、政府等组织向公众传递信息的重要途径之一&#xff0c;也是媒体获取新闻素材的主要来源。一篇优质的新聞稿不仅可以吸引读者的注意力&#xff0c;还可以提高组织的形象和声誉。因此写好新闻稿至关重要。下面伯乐网络传媒来给大家探讨一些新闻稿写作的注意事…

人工智能AI 全栈体系(十二)

第二章 计算机是如何学会下棋的 下棋一直被认为是人类的高智商游戏&#xff0c;从人工智能诞生的那一天开始&#xff0c;研究者就开始研究计算机如何下棋。著名人工智能学者、图灵奖获得者约翰麦卡锡在 50 年代就开始从事计算机下棋方面的研究工作&#xff0c;并提出了著名的 …

如何使用Node.js快速创建HTTP服务器并实现公网访问本地Server

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

哪一波最容易亏钱,昂首资本这样讲

有交易者咨询anzo capital昂首资本&#xff0c;按照波浪理论最容易亏钱是在第几波&#xff0c;通过调查得知80%的错误发生在第四波。所以对哪一波最容易亏钱&#xff0c;很有可能就是第四波。当然了如果能准确的判断第四波时&#xff0c;也可能获得相当丰厚的利润。 第四波通…

❤️ React的安装和使用(实战篇)

React的安装和使用 一、React的安装和使用 reactJs警告提示&#xff1a; This version of tar is no longer supported, and will not receive security updates. Please upgrade asap 翻译&#xff1a;tar2.2.2&#xff1a;此版本的tar不再受支持&#xff0c;将不会收到安全…

CentOS 7使用RPM包安装MySQL5.7

目标 本文目标是简单介绍如何在CentOS 7上使用RPM包安装MySQL 5.7&#xff0c;然后描述如何调整存储路径datadir。 环境准备 操作系统 —— CentOS 7MySQL版本 —— MySQL 5.7.44 获取MySQL-rpm包 官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.htm…

如何安装Wnmp并结合内网穿透实现外网访问内网Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

VSIX:C#项目 重命名所有标识符(Visual Studio扩展开发)

出于某种目的&#xff08;合法的&#xff0c;真的合法的&#xff0c;合同上明确指出可以这样做&#xff09;&#xff0c;我准备了一个重命名所有标识符的VS扩展&#xff0c;用来把一个C#库改头换面&#xff0c;在简单的测试项目上工作很满意&#xff0c;所有标识符都被准确替换…

浅述边缘计算场景下的云边端协同融合架构的应用场景示例

云计算正在向一种更加全局化的分布式节点组合形态进阶&#xff0c;而边缘计算是云计算能力向边缘侧分布式拓展的新触角。随着城市建设进程加快&#xff0c;海量设备产生的数据&#xff0c;若上传到云端进行处理&#xff0c;会对云端造成巨大压力。如果利用边缘计算来让云端的能…

第九周实验记录

1、安装Nerfstudio 环境配置 首先需要创建环境python3.8&#xff0c;接着需要安装cuda11.7或11.3 这里安装cuda11.7 pip uninstall torch torchvision functorchpip install torch1.13.1 torchvision functorch --extra-index-url https://download.pytorch.org/whl/cu117安…

Hive从入门到大牛【Hive 学习笔记】

文章目录 什么是HiveHive的数据存储Hive的系统架构MetastoreHive VS Mysql数据库 VS 数据仓库 Hive安装部署Hive的使用方式命令行方式JDBC方式 Set命令的使用Hive的日志配置Hive中数据库的操作Hive中表的操作 Hive中的数据类型基本数据类型复合数据类型ArrayMapStructStruct和M…

简述PyQt5布局管理

PyQt5的布局管理方法主要包括以下几种&#xff1a; 水平布局&#xff08;QHBoxLayout&#xff09;&#xff1a;可以将所添加的控件在水平方向上依次排列。垂直布局&#xff08;QVBoxLayout&#xff09;&#xff1a;可以将所添加的空间在垂直方向上依次排列。网格布局&#xff…

web3 dapp React项目引入 antd 对 balance 用户token信息组件进行样式改造

好 上文 web3 React dapp中编写balance组件从redux取出并展示用户资产 我们简单处理了用户资产的展示 那么 我们继续 先启动 ganache 环境 终端输入 ganache -d然后 打开我们的项目 将合约发布到区块链上 truffle migrate --reset然后 我们启动项目 确认一切正常 还原到上文…

day2 ARM基础

.text .globl _start _start:mov r0,#0 mov r1,#0 addfunc:add r0,r0,#1 r0自增1adds r1,r1,r0 R1实现1~100累加cmp r0,#100 判断r0是否到100bleq loop r0等于100 进入死循环 blne addfunc r0等于100跳转至循环累加 loop:b loopstop:b stop.end 【汇编…

淘宝婴儿用品购买情况分析报告

一.分析背景和目的 随着购物网站的发展&#xff0c;人们的网络购物行为占比也快速增加。为了能够获取更多的用户&#xff0c;提升商家的销售量&#xff0c;需要从产品和用户不同的角度进行分析&#xff0c;进而得到有价值的信息&#xff0c;指导商家进行获客和营销。本文就以淘…